mirror of
https://github.com/newren/git-filter-repo.git
synced 2024-07-06 18:32:14 +02:00
filter-repo: collect various short functions into a GitUtils helper class
Signed-off-by: Elijah Newren <newren@gmail.com>
This commit is contained in:
parent
2f3a445875
commit
fc90cf8ca9
112
git-filter-repo
112
git-filter-repo
@ -26,8 +26,8 @@ from datetime import tzinfo, timedelta, datetime
|
|||||||
|
|
||||||
__all__ = ["Blob", "Reset", "FileChanges", "Commit", "Tag", "Progress",
|
__all__ = ["Blob", "Reset", "FileChanges", "Commit", "Tag", "Progress",
|
||||||
"Checkpoint", "FastExportFilter", "FixedTimeZone", "ProgressWriter",
|
"Checkpoint", "FastExportFilter", "FixedTimeZone", "ProgressWriter",
|
||||||
"fast_export_output", "fast_import_input", "get_commit_count",
|
"fast_export_output", "fast_import_input", "record_id_rename",
|
||||||
"get_total_objects", "record_id_rename", "FilteringOptions"]
|
"GitUtils", "FilteringOptions"]
|
||||||
|
|
||||||
|
|
||||||
def _timedelta_to_seconds(delta):
|
def _timedelta_to_seconds(delta):
|
||||||
@ -1627,34 +1627,6 @@ def fast_import_input(target_repo, extra_args = None):
|
|||||||
stdin=subprocess.PIPE,
|
stdin=subprocess.PIPE,
|
||||||
cwd=target_repo)
|
cwd=target_repo)
|
||||||
|
|
||||||
def get_commit_count(repo, *args):
|
|
||||||
"""
|
|
||||||
Return the number of commits that have been made on repo.
|
|
||||||
"""
|
|
||||||
if not args:
|
|
||||||
args = ['--all']
|
|
||||||
if len(args) == 1 and isinstance(args[0], list):
|
|
||||||
args = args[0]
|
|
||||||
p1 = subprocess.Popen(["git", "rev-list"] + args,
|
|
||||||
bufsize=-1,
|
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
|
||||||
cwd=repo)
|
|
||||||
p2 = subprocess.Popen(["wc", "-l"], stdin=p1.stdout, stdout=subprocess.PIPE)
|
|
||||||
count = int(p2.communicate()[0])
|
|
||||||
if p1.poll() != 0:
|
|
||||||
raise SystemExit("%s does not appear to be a valid git repository" % repo)
|
|
||||||
return count
|
|
||||||
|
|
||||||
def get_total_objects(repo):
|
|
||||||
"""
|
|
||||||
Return the number of objects (both packed and unpacked)
|
|
||||||
"""
|
|
||||||
p1 = subprocess.Popen(["git", "count-objects", "-v"],
|
|
||||||
stdout=subprocess.PIPE, cwd=repo)
|
|
||||||
lines = p1.stdout.read().splitlines()
|
|
||||||
# Return unpacked objects + packed-objects
|
|
||||||
return int(lines[0].split()[1]) + int(lines[2].split()[1])
|
|
||||||
|
|
||||||
def record_id_rename(old_id, new_id):
|
def record_id_rename(old_id, new_id):
|
||||||
"""
|
"""
|
||||||
Register a new translation
|
Register a new translation
|
||||||
@ -1668,7 +1640,58 @@ _EXTRA_CHANGES = {} # idnum -> list of list of FileChanges
|
|||||||
_SKIPPED_COMMITS = set()
|
_SKIPPED_COMMITS = set()
|
||||||
_CURRENT_STREAM_NUMBER = 0
|
_CURRENT_STREAM_NUMBER = 0
|
||||||
|
|
||||||
######################################################################
|
class GitUtils(object):
|
||||||
|
@staticmethod
|
||||||
|
def get_commit_count(repo, *args):
|
||||||
|
"""
|
||||||
|
Return the number of commits that have been made on repo.
|
||||||
|
"""
|
||||||
|
if not args:
|
||||||
|
args = ['--all']
|
||||||
|
if len(args) == 1 and isinstance(args[0], list):
|
||||||
|
args = args[0]
|
||||||
|
p1 = subprocess.Popen(["git", "rev-list"] + args,
|
||||||
|
bufsize=-1,
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||||
|
cwd=repo)
|
||||||
|
p2 = subprocess.Popen(["wc", "-l"], stdin=p1.stdout, stdout=subprocess.PIPE)
|
||||||
|
count = int(p2.communicate()[0])
|
||||||
|
if p1.poll() != 0:
|
||||||
|
raise SystemExit("%s does not appear to be a valid git repository" % repo)
|
||||||
|
return count
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_total_objects(repo):
|
||||||
|
"""
|
||||||
|
Return the number of objects (both packed and unpacked)
|
||||||
|
"""
|
||||||
|
p1 = subprocess.Popen(["git", "count-objects", "-v"],
|
||||||
|
stdout=subprocess.PIPE, cwd=repo)
|
||||||
|
lines = p1.stdout.read().splitlines()
|
||||||
|
# Return unpacked objects + packed-objects
|
||||||
|
return int(lines[0].split()[1]) + int(lines[2].split()[1])
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_repository_bare():
|
||||||
|
out = subprocess.check_output('git rev-parse --is-bare-repository'.split())
|
||||||
|
return (out.strip() == 'true')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def determine_git_dir():
|
||||||
|
out = subprocess.check_output('git rev-parse --git-dir'.split())
|
||||||
|
return out.strip()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_refs():
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output('git show-ref'.split())
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
# If error code is 1, there just aren't any refs; i.e. new repo.
|
||||||
|
# If error code is other than 1, some other error (e.g. not a git repo)
|
||||||
|
if e.returncode != 1:
|
||||||
|
raise SystemExit('fatal: {}'.format(e))
|
||||||
|
output = ''
|
||||||
|
return dict(reversed(x.split()) for x in output.splitlines())
|
||||||
|
|
||||||
class FilteringOptions(object):
|
class FilteringOptions(object):
|
||||||
class AppendFilter(argparse.Action):
|
class AppendFilter(argparse.Action):
|
||||||
@ -1868,14 +1891,6 @@ class FilteringOptions(object):
|
|||||||
FilteringOptions.sanity_check_args(args)
|
FilteringOptions.sanity_check_args(args)
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def is_repository_bare():
|
|
||||||
output = subprocess.check_output('git rev-parse --is-bare-repository'.split())
|
|
||||||
return (output.strip() == 'true')
|
|
||||||
|
|
||||||
def determine_git_dir():
|
|
||||||
output = subprocess.check_output('git rev-parse --git-dir'.split())
|
|
||||||
return output.strip()
|
|
||||||
|
|
||||||
def sanity_check(refs, is_bare):
|
def sanity_check(refs, is_bare):
|
||||||
def abort(reason):
|
def abort(reason):
|
||||||
raise SystemExit(
|
raise SystemExit(
|
||||||
@ -1897,7 +1912,7 @@ def sanity_check(refs, is_bare):
|
|||||||
|
|
||||||
# Avoid letting people running with weird setups and overwriting GIT_DIR
|
# Avoid letting people running with weird setups and overwriting GIT_DIR
|
||||||
# elsewhere
|
# elsewhere
|
||||||
git_dir = determine_git_dir()
|
git_dir = GitUtils.determine_git_dir()
|
||||||
if is_bare and git_dir != '.':
|
if is_bare and git_dir != '.':
|
||||||
abort("GIT_DIR must be .")
|
abort("GIT_DIR must be .")
|
||||||
elif not is_bare and git_dir != '.git':
|
elif not is_bare and git_dir != '.git':
|
||||||
@ -1937,17 +1952,6 @@ def sanity_check(refs, is_bare):
|
|||||||
if rev != refs[origin_ref]:
|
if rev != refs[origin_ref]:
|
||||||
abort('{} does not match {}'.format(refname, origin_ref))
|
abort('{} does not match {}'.format(refname, origin_ref))
|
||||||
|
|
||||||
def get_refs():
|
|
||||||
try:
|
|
||||||
output = subprocess.check_output('git show-ref'.split())
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
# If error code is 1, there just isn't any refs; i.e. bare repo.
|
|
||||||
# If error code is other than 1, some other error (e.g. not a git repo)
|
|
||||||
if e.returncode != 1:
|
|
||||||
raise SystemExit('fatal: {}'.format(e))
|
|
||||||
output = ''
|
|
||||||
return dict(reversed(x.split()) for x in output.splitlines())
|
|
||||||
|
|
||||||
def analyze_commit(stats, graph, commit, parents, date, file_changes):
|
def analyze_commit(stats, graph, commit, parents, date, file_changes):
|
||||||
def equiv_class(filename):
|
def equiv_class(filename):
|
||||||
return stats['equivalence'].get(filename, (filename,))
|
return stats['equivalence'].get(filename, (filename,))
|
||||||
@ -2496,9 +2500,9 @@ def run_fast_filter():
|
|||||||
print("[DEBUG] Parsed arguments:\n{}".format(args))
|
print("[DEBUG] Parsed arguments:\n{}".format(args))
|
||||||
|
|
||||||
# Determine basic repository information
|
# Determine basic repository information
|
||||||
orig_refs = get_refs()
|
orig_refs = GitUtils.get_refs()
|
||||||
is_bare = is_repository_bare()
|
is_bare = GitUtils.is_repository_bare()
|
||||||
git_dir = determine_git_dir()
|
git_dir = GitUtils.determine_git_dir()
|
||||||
|
|
||||||
# Do analysis, if requested
|
# Do analysis, if requested
|
||||||
if args.analyze:
|
if args.analyze:
|
||||||
|
Loading…
Reference in New Issue
Block a user