def test_sendchange_defaults(self): d = runner.sendchange(dict(who="me", master="a:1")) def check(_): # called correctly self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs), ( "a:1", ["change", "changepw"], "utf8", { "branch": None, "category": None, "comments": "", "files": (), "project": "", "properties": {}, "repository": "", "revision": None, "revlink": "", "when": None, "who": "me", "vc": None, }, ), ) # nothing to stdout self.assertEqual(self.stdout.getvalue(), "") d.addCallback(check) return d
def test_sendchange_defaults(self): d = runner.sendchange(dict(who='me', master='a:1')) def check(_): # called correctly self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs), ('a:1', ['change', 'changepw'], 'utf8', { 'branch': None, 'category': None, 'comments': '', 'files': (), 'project': '', 'properties': {}, 'repository': '', 'revision': None, 'revlink': '', 'when': None, 'who': 'me' })) # nothing to stdout self.assertEqual(self.stdout.getvalue(), '') d.addCallback(check) return d
def test_sendchange_deprecated_username(self): d = runner.sendchange(dict(username='******', master='a:1')) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['who']), ('a:1', ['change','changepw'], 'utf8', 'me')) self.assertIn('is deprecated', self.stdout.getvalue()) d.addCallback(check) return d
def test_sendchange_auth_prompt(self): self.patch(getpass, 'getpass', lambda prompt : 'sekrit') d = runner.sendchange(dict(who='me', master='a:1', auth='user')) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding), ('a:1', ['user','sekrit'], 'utf8')) self.assertEqual(self.stdout.getvalue(), '') d.addCallback(check) return d
def test_sendchange_bad_vc(self): d = defer.maybeDeferred(lambda : runner.sendchange(dict(master='a:1', who="abc", vc="blargh"))) def cb(_): self.fail("shouldn't succeed") def eb(f): f.trap(AssertionError) pass # A-OK d.addCallbacks(cb, eb) return d
def test_sendchange_master_required(self): d = defer.maybeDeferred(lambda : runner.sendchange(dict(who='abc'))) def cb(_): self.fail("shouldn't succeed") def eb(f): f.trap(AssertionError) pass # A-OK d.addCallbacks(cb, eb) return d
def test_sendchange_deprecated_username(self): d = runner.sendchange(dict(username='******', master='a:1')) def check(_): self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['who']), ('a:1', ['change', 'changepw'], 'utf8', 'me')) self.assertIn('is deprecated', self.stdout.getvalue()) d.addCallback(check) return d
def test_sendchange_auth_prompt(self): self.patch(getpass, "getpass", lambda prompt: "sekrit") d = runner.sendchange(dict(who="me", master="a:1", auth="user")) def check(_): self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding), ("a:1", ["user", "sekrit"], "utf8") ) self.assertEqual(self.stdout.getvalue(), "") d.addCallback(check) return d
def _testSender_1(self, res): self.cm = cm = self.master.change_svc s1 = list(self.cm)[0] port = self.master.slavePort._port.getHost().port self.options = {'username': "******", 'master': "localhost:%d" % port, 'files': ["foo.c"], } d = runner.sendchange(self.options) d.addCallback(self._testSender_2) return d
def _testSender_1(self, res): self.cm = self.master.change_svc port = self.master.slavePort._port.getHost().port self.options = {'username': "******", 'master': "localhost:%d" % port, 'files': ["foo.c"], 'category': "categoryA", } d = runner.sendchange(self.options) d.addCallback(self._testSender_2) return d
def test_sendchange_logfile(self): open('lf', 'w').write('hello') d = runner.sendchange(dict(who='me', master='a:1', logfile='lf')) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['comments']), ('a:1', ['change','changepw'], 'utf8', 'hello')) self.assertEqual(self.stdout.getvalue(), '') try: os.unlink('lf') except: pass d.addCallback(check) return d
def _testSender_5(self, res): self.failUnlessEqual(len(self.cm.changes), 1) c = self.cm.changes.pop() self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "") self.failUnlessEqual(c.revision, 42) # verify --branch too self.options['branch'] = "branches/test" d = runner.sendchange(self.options) d.addCallback(self._testSender_6) return d
def _testSender_5(self, res): c = self.cm.getChangeNumberedNow(4) self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "") self.failUnlessEqual(c.revision, "42") self.failUnlessEqual(c.category, "categoryA") # verify --branch too self.options['branch'] = "branches/test" d = runner.sendchange(self.options) d.addCallback(self._testSender_6) return d
def _testSender_2(self, res): # now check that the change was received c = self.cm.getChangeNumberedNow(1) self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "") self.failUnlessEqual(c.revision, None) self.failUnlessEqual(c.category, "categoryA") self.options['revision'] = "r123" self.options['comments'] = "test change" d = runner.sendchange(self.options) d.addCallback(self._testSender_3) return d
def _testSender_2(self, res): # now check that the change was received self.failUnlessEqual(len(self.cm.changes), 1) c = self.cm.changes.pop() self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "") self.failUnlessEqual(c.revision, None) self.options['revision'] = "r123" self.options['comments'] = "test change" d = runner.sendchange(self.options) d.addCallback(self._testSender_3) return d
def test_sendchange_logfile(self): with open('lf', 'w') as f: f.write('hello') d = runner.sendchange(dict(who='me', master='a:1', logfile='lf')) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['comments']), ('a:1', ['change','changepw'], 'utf8', 'hello')) self.assertEqual(self.stdout.getvalue(), '') try: os.unlink('lf') except: pass d.addCallback(check) return d
def test_sendchange_revision_file(self): with open('rf', 'w') as f: f.write('abcd') d = runner.sendchange(dict(who='me', master='a:1', revision_file='rf')) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['revision']), ('a:1', ['change','changepw'], 'utf8', 'abcd')) self.assertEqual(self.stdout.getvalue(), '') try: os.unlink('rf') except: pass d.addCallback(check) return d
def test_sendchange_args(self): d = runner.sendchange( dict( encoding="utf16", who="me", auth="a:b", master="a:1", branch="br", category="cat", revision="rr", properties={"a": "b"}, repository="rep", project="prj", vc="git", revlink="rl", when="1234", comments="comm", files=("a", "b"), ) ) def check(_): self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs), ( "a:1", ["a", "b"], "utf16", { "branch": "br", "category": "cat", "comments": "comm", "files": ("a", "b"), "project": "prj", "properties": {"a": "b"}, "repository": "rep", "revision": "rr", "revlink": "rl", "when": 1234.0, "who": "me", "vc": "git", }, ), ) self.assertEqual(self.stdout.getvalue(), "") d.addCallback(check) return d
def _testSender_6(self, res): self.failUnlessEqual(len(self.cm.changes), 1) c = self.cm.changes.pop() self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "") self.failUnlessEqual(c.revision, 42) self.failUnlessEqual(c.branch, "branches/test") self.failUnlessEqual(c.category, "categoryA") self.failUnlessEqual(c.repository, None) self.options['repository'] = "svn://my.repository/data/project1" d = runner.sendchange(self.options) d.addCallback(self._testSender_7) return d
def _testSender_4(self, res): c = self.cm.getChangeNumberedNow(3) self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "longer test change") self.failUnlessEqual(c.revision, "r123") self.failUnlessEqual(c.category, "categoryA") # make sure that numeric revisions work too. They are now treated # just like strings. self.options['logfile'] = None self.options['revision'] = "42" d = runner.sendchange(self.options) d.addCallback(self._testSender_5) return d
def test_sendchange_logfile_stdin(self): stdin = mock.Mock() stdin.read = lambda : 'hi!' self.patch(sys, 'stdin', stdin) d = runner.sendchange(dict(who='me', master='a:1', logfile='-')) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['comments']), ('a:1', ['change','changepw'], 'utf8', 'hi!')) self.assertEqual(self.stdout.getvalue(), '') try: os.unlink('lf') except: pass d.addCallback(check) return d
def _testSender_4(self, res): self.failUnlessEqual(len(self.cm.changes), 1) c = self.cm.changes.pop() self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "longer test change") self.failUnlessEqual(c.revision, "r123") # make sure that numeric revisions work too self.options['logfile'] = None del self.options['revision'] self.options['revision_number'] = 42 d = runner.sendchange(self.options) d.addCallback(self._testSender_5) return d
def test_sendchange_revision_file(self): open('rf', 'w').write('abcd') d = runner.sendchange(dict(who='me', master='a:1', revision_file='rf')) def check(_): self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs['revision']), ('a:1', ['change', 'changepw'], 'utf8', 'abcd')) self.assertEqual(self.stdout.getvalue(), '') try: os.unlink('rf') except: pass d.addCallback(check) return d
def test_sendchange_logfile(self): with open("lf", "w") as f: f.write("hello") d = runner.sendchange(dict(who="me", master="a:1", logfile="lf")) def check(_): self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs["comments"]), ("a:1", ["change", "changepw"], "utf8", "hello"), ) self.assertEqual(self.stdout.getvalue(), "") try: os.unlink("lf") except: pass d.addCallback(check) return d
def _testSender_3(self, res): self.failUnlessEqual(len(self.cm.changes), 1) c = self.cm.changes.pop() self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "test change") self.failUnlessEqual(c.revision, "r123") # test options['logfile'] by creating a temporary file logfile = self.mktemp() f = open(logfile, "wt") f.write("longer test change") f.close() self.options['comments'] = None self.options['logfile'] = logfile d = runner.sendchange(self.options) d.addCallback(self._testSender_4) return d
def test_sendchange_logfile_stdin(self): stdin = mock.Mock() stdin.read = lambda: "hi!" self.patch(sys, "stdin", stdin) d = runner.sendchange(dict(who="me", master="a:1", logfile="-")) def check(_): self.assertEqual( (self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs["comments"]), ("a:1", ["change", "changepw"], "utf8", "hi!"), ) self.assertEqual(self.stdout.getvalue(), "") try: os.unlink("lf") except: pass d.addCallback(check) return d
def _testSender_3(self, res): c = self.cm.getChangeNumberedNow(2) self.failUnlessEqual(c.who, "alice") self.failUnlessEqual(c.files, ["foo.c"]) self.failUnlessEqual(c.comments, "test change") self.failUnlessEqual(c.revision, "r123") self.failUnlessEqual(c.category, "categoryA") # test options['logfile'] by creating a temporary file logfile = self.mktemp() f = open(logfile, "wt") f.write("longer test change") f.close() self.options['comments'] = None self.options['logfile'] = logfile d = runner.sendchange(self.options) d.addCallback(self._testSender_4) return d
def test_sendchange_args(self): d = runner.sendchange( dict(encoding='utf16', who='me', auth='a:b', master='a:1', branch='br', category='cat', revision='rr', properties={'a': 'b'}, repository='rep', project='prj', revlink='rl', when='1234', comments='comm', files=('a', 'b'))) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs), ('a:1', ['a', 'b'], 'utf16', { 'branch': 'br', 'category': 'cat', 'comments': 'comm', 'files': ('a', 'b'), 'project': 'prj', 'properties': { 'a': 'b' }, 'repository': 'rep', 'revision': 'rr', 'revlink': 'rl', 'when': 1234.0, 'who': 'me' })) self.assertEqual(self.stdout.getvalue(), '') d.addCallback(check) return d
def test_sendchange_defaults(self): d = runner.sendchange(dict(who='me', master='a:1')) def check(_): # called correctly self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs), ('a:1', ['change','changepw'], 'utf8', { 'branch': None, 'category': None, 'comments': '', 'files': (), 'project': '', 'properties': {}, 'repository': '', 'revision': None, 'revlink': '', 'when': None, 'who': 'me'})) # nothing to stdout self.assertEqual(self.stdout.getvalue(), '') d.addCallback(check) return d
def test_sendchange_args(self): d = runner.sendchange(dict(encoding='utf16', who='me', auth='a:b', master='a:1', branch='br', category='cat', revision='rr', properties={'a':'b'}, repository='rep', project='prj', revlink='rl', when='1234', comments='comm', files=('a', 'b'))) def check(_): self.assertEqual((self.sender.master, self.sender.auth, self.sender.encoding, self.sender.send_kwargs), ('a:1', ['a','b'], 'utf16', { 'branch': 'br', 'category': 'cat', 'comments': 'comm', 'files': ('a', 'b'), 'project': 'prj', 'properties': {'a':'b'}, 'repository': 'rep', 'revision': 'rr', 'revlink': 'rl', 'when': 1234.0, 'who': 'me'})) self.assertEqual(self.stdout.getvalue(), '') d.addCallback(check) return d
def test_sendchange_bad_vc(self): d = defer.maybeDeferred(lambda : runner.sendchange(dict(master='a:1', who="abc", vc="blargh"))) return self.assertFailure(d, AssertionError)
if len(logfiles) > 1: print("Warning, multiple ++log.* files found, getting comments " "from the first one") if logfiles: open(commentfile, "w").write(open(logfiles[0], "r").read()) elif os.getenv("ARCH_HOOK_ACTION") == "commit": revision = os.getenv("ARCH_REVISION") files = [] if os.path.exists(filelist): f = open(filelist, "r") for line in f.readlines(): files.append(line.rstrip()) if not files: # buildbot insists upon having at least one modified file (otherwise # the prefix-stripping mechanism will ignore the change) files = ["dummy"] if os.path.exists(commentfile): comments = open(commentfile, "r").read() else: comments = "commit from arch" c = {"master": master, "username": username, "revision": revision, "comments": comments, "files": files} runner.sendchange(c, True) if os.path.exists(filelist): os.unlink(filelist) if os.path.exists(commentfile): os.unlink(commentfile)
from buildbot.scripts import runner MASTER = sys.argv[1] CHANGESET_ID = os.environ["HG_NODE"] # TODO: consider doing 'import mercurial.hg' and extract this information # using the native python out = commands.getoutput( "hg log -r %s --template '{author}\n{files}\n{desc}'" % CHANGESET_ID) s = StringIO(out) user = s.readline().strip() # NOTE: this fail when filenames contain spaces. I cannot find a way to get # hg to use some other filename separator. files = s.readline().strip().split() comments = "".join(s.readlines()) change = { 'master': MASTER, # note: this is more likely to be a full email address, which would make # the left-hand "Changes" column kind of wide. The buildmaster should # probably be improved to display an abbreviation of the username. 'username': user, 'revision': CHANGESET_ID, 'comments': comments, 'files': files, } runner.sendchange(change, True)
def test_sendchange_master_required(self): d = defer.maybeDeferred(lambda : runner.sendchange(dict(who='abc'))) return self.assertFailure(d, AssertionError)