From 599a9dc518573701729b427bbe2a5f74309470d0 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 11:46:00 +0000 Subject: [PATCH 1/7] Add a method to detect if a changed set was force pushed or not --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 9029f31..318e8ca 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -806,6 +806,15 @@ def get_revs_between(torev, fromrev, abspath): return pagure.lib.git.read_git_lines(cmd, abspath) +def is_forced_push(torev, fromrev, abspath): + """ Returns wether there was a force push between HEAD and BASE. """ + + # Returns if there was any commits deleted in the changeset + cmd = ['rev-list', '%s' % torev, '^%s' % (fromrev)] + out = pagure.lib.git.read_git_lines(cmd, abspath) + return len(out) > 0 + + def get_pusher(commit, abspath): ''' Return the name of the person that pushed the commit. ''' user = pagure.lib.git.read_git_lines( From 20364a82157d2783a5673b2162bccfe79d8de5d0 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 11:46:00 +0000 Subject: [PATCH 2/7] Add a method to find the base revision between two commits --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 318e8ca..6acd1b9 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -815,6 +815,14 @@ def is_forced_push(torev, fromrev, abspath): return len(out) > 0 +def get_base_revision(torev, fromrev, abspath): + """ Return the base revision between HEAD and BASE. + This is useful in case of force-push. + """ + cmd = ['merge-base', fromrev, torev] + return pagure.lib.git.read_git_lines(cmd, abspath) + + def get_pusher(commit, abspath): ''' Return the name of the person that pushed the commit. ''' user = pagure.lib.git.read_git_lines( From daf4ee37da0ece7c0b4b8faa979ed2dcf7b068e8 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 11:46:00 +0000 Subject: [PATCH 3/7] Fix indentation and handle forced push correctly This means, we well only publish fedmsg message for new commits even if there was a force-push --- diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 264387f..15b53ca 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -72,9 +72,13 @@ for line in sys.stdin.readlines(): (oldrev, newrev, refname) = line.strip().split(' ', 2) if set(newrev) == set(['0']): - print "Deleting a reference/branch, so we won't run the "\ - "pagure hook" - break + print "Deleting a reference/branch, so we won't run the "\ + "pagure hook" + break + elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath): + base = pagure.lib.git.get_base_revision(oldrev, newrev, abspath) + if base: + oldrev = base[0] revs = pagure.lib.git.get_revs_between(oldrev, newrev, abspath) project_name = pagure.lib.git.get_repo_name(abspath) From 2a5cbaef997063d094c8a5626c0ac2a87b93f972 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 11:46:01 +0000 Subject: [PATCH 4/7] Add a method to retrieve the default branch of a git repo --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 6acd1b9..47bd0fe 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -823,6 +823,16 @@ def get_base_revision(torev, fromrev, abspath): return pagure.lib.git.read_git_lines(cmd, abspath) +def get_default_branch(abspath): + """ Return the default branch of a repo. """ + cmd = ['rev-parse', '--abbrev-ref', 'HEAD'] + out = pagure.lib.git.read_git_lines(cmd, abspath) + if out: + return out[0] + else: + return 'master' + + def get_pusher(commit, abspath): ''' Return the name of the person that pushed the commit. ''' user = pagure.lib.git.read_git_lines( From 75a9b674c56bbe836213356b4c53d330da70e205 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 11:46:01 +0000 Subject: [PATCH 5/7] Fix getting the commits of a new branch Currently we were not publishing any messages for new branch added to a repo. In order to do this properly, we need to find the list of commits that is present in the new branch and not in the default branch. --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 47bd0fe..24e106a 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -803,6 +803,9 @@ def get_revs_between(torev, fromrev, abspath): cmd = ['rev-list', '%s...%s' % (torev, fromrev)] if set(fromrev) == set('0'): cmd = ['rev-list', '%s' % torev] + elif set(torev) == set('0') or set(torev) == set('^0'): + head = get_default_branch(abspath) + cmd = ['rev-list', '%s' % fromrev, '^%s' % head] return pagure.lib.git.read_git_lines(cmd, abspath) From d75ae77b261ab9d9c5af7ea56ce1e493611c22e9 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 11:46:01 +0000 Subject: [PATCH 6/7] Fix sending fedmsg message for new branch --- diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 15b53ca..17987c4 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -75,6 +75,9 @@ for line in sys.stdin.readlines(): print "Deleting a reference/branch, so we won't run the "\ "pagure hook" break + elif set(oldrev) == set(['0']): + print "New reference/branch" + oldrev = '^%s' % oldrev elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath): base = pagure.lib.git.get_base_revision(oldrev, newrev, abspath) if base: From 72398f2a399c9cd89a8f1d8c922dd990e670a408 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 01 2015 13:12:12 +0000 Subject: [PATCH 7/7] When a branch is rebased, ignore the commits present in the default branch Until now, when a branch was rebased, we would publish a message for each message in that branch compared to the default branch, even if the commits had already been merged into that default branch. Now, we'll only publish messages about commits specific to that branch --- diff --git a/pagure/hooks/files/fedmsg_hook.py b/pagure/hooks/files/fedmsg_hook.py index 17987c4..57e149b 100755 --- a/pagure/hooks/files/fedmsg_hook.py +++ b/pagure/hooks/files/fedmsg_hook.py @@ -71,6 +71,7 @@ seen = [] for line in sys.stdin.readlines(): (oldrev, newrev, refname) = line.strip().split(' ', 2) + forced = False if set(newrev) == set(['0']): print "Deleting a reference/branch, so we won't run the "\ "pagure hook" @@ -79,11 +80,13 @@ for line in sys.stdin.readlines(): print "New reference/branch" oldrev = '^%s' % oldrev elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath): + forced = True base = pagure.lib.git.get_base_revision(oldrev, newrev, abspath) if base: oldrev = base[0] - revs = pagure.lib.git.get_revs_between(oldrev, newrev, abspath) + revs = pagure.lib.git.get_revs_between( + oldrev, newrev, abspath, forced=forced) project_name = pagure.lib.git.get_repo_name(abspath) username = pagure.lib.git.get_username(abspath) project = pagure.lib.get_project(pagure.SESSION, project_name, username) diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 24e106a..36e6e36 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -797,10 +797,13 @@ def read_git_lines(args, abspath, keepends=False, **kw): ).splitlines(keepends) -def get_revs_between(torev, fromrev, abspath): +def get_revs_between(torev, fromrev, abspath, forced=False): """ Yield revisions between HEAD and BASE. """ cmd = ['rev-list', '%s...%s' % (torev, fromrev)] + if forced: + head = get_default_branch(abspath) + cmd.append('^%s' % head) if set(fromrev) == set('0'): cmd = ['rev-list', '%s' % torev] elif set(torev) == set('0') or set(torev) == set('^0'):