...
 
Commits (3)
......@@ -22,6 +22,7 @@ Copyright (C) 2014 Joseph Wang <https://sourceforge.net/u/drjoe/profile/)>
Copyright (C) 2014 Tom Monaco <http://www.thomasmonaco.com/>
Copyright (C) 2014 Manab Chetia <manab.chetia@outlook.com>
Copyright (C) 2015 Nicola (https://sourceforge.net/u/swisscarbon/profile/)
Copyright (C) 2016 Roger (rogerdc@gmail.com)
Files under taskcoachlib/thirdparty are, well, third party. They come
with their own license. They may include modifications from the
......
......@@ -45,6 +45,20 @@ hack zope.interface (a Twisted dependency) as described here:
http://stackoverflow.com/questions/7816799/getting-py2exe-to-work-with-zope-interface
Starting with 1.4.4 you'll also need python-igraph. Binaries are
available for Windows, but installing this on OSX is a bit
difficult. The best way is probably to install the C core using Brew,
and then the Python extension using pip:
brew install gcc
brew tap homebrew/science
brew install --use-gcc --universal igraph
sudo pip install python-igraph
Note that --universal is needed because wxWidgets 2.x is 32-bits only;
--use-gcc is needed because of a bug in recent versions of the XCode
command-line tools, which make the link fail.
--- Preparation -----------------------------------------------------
Task Coach needs a few generated files, run the following command
......
......@@ -77,12 +77,14 @@ sdist_ubuntu: sdist_linux
cp dist/TaskCoach-$(TCVERSION).tar.gz dist/taskcoach_$(TCVERSION)-0ubuntu14~trusty.tar.gz
cp dist/TaskCoach-$(TCVERSION).tar.gz dist/taskcoach_$(TCVERSION)-0ubuntu15~vivid.tar.gz
cp dist/TaskCoach-$(TCVERSION).tar.gz dist/taskcoach_$(TCVERSION)-0ubuntu15~wily.tar.gz
cp dist/TaskCoach-$(TCVERSION).tar.gz dist/taskcoach_$(TCVERSION)-0ubuntu16~xenial.tar.gz
cp dist/TaskCoach-$(TCVERSION).tar.gz dist/taskcoach_$(TCVERSION)-0ubuntu18~bionic.tar.gz
sdist_raw:
mkdir -p dist
cp -a . ../tmp-sdist
cd ../tmp-sdist; make nuke; find . -name ".svn" | xargs -d '\n' rm -rf
mv ../tmp-sdist dist/TaskCoach-$(TCVERSION)
cp -a . ../../tmp-sdist
cd ../../tmp-sdist; make nuke; find . -name ".hg" | xargs -d '\n' rm -rf
mv ../../tmp-sdist dist/TaskCoach-$(TCVERSION)
cd dist; tar czf TaskCoach-$(TCVERSION)-raw.tgz TaskCoach-$(TCVERSION); rm -rf TaskCoach-$(TCVERSION)
dist/TaskCoach-$(TCVERSION).tar.gz:
......@@ -119,12 +121,18 @@ ubuntu: sdist_ubuntu
mv build build-vivid
LC_ALL=C $(PYTHON) pymake.py bdist_ubuntu wily 15 --sdist=dist/taskcoach_$(TCVERSION)-0ubuntu15~wily.tar.gz
mv build build-wily
LC_ALL=C $(PYTHON) pymake.py bdist_ubuntu xenial 16 --sdist=dist/taskcoach_$(TCVERSION)-0ubuntu16~xenial.tar.gz
mv build build-xenial
LC_ALL=C $(PYTHON) pymake.py bdist_ubuntu bionic 18 --sdist=dist/taskcoach_$(TCVERSION)-0ubuntu18~bionic.tar.gz
mv build build-bionic
ppa_sign: ubuntu
cd build-precise; debsign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu12~precise-1_source.changes
cd build-trusty; debsign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu14~trusty-1_source.changes
cd build-vivid; debsign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu15~vivid-1_source.changes
cd build-wily; debsign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu15~wily-1_source.changes
cd build-precise; debsign --re-sign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu12~precise-1_source.changes
cd build-trusty; debsign --re-sign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu14~trusty-1_source.changes
cd build-vivid; debsign --re-sign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu15~vivid-1_source.changes
cd build-wily; debsign --re-sign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu15~wily-1_source.changes
cd build-xenial; debsign --re-sign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu16~xenial-1_source.changes
cd build-bionic; debsign --re-sign -k0x$(PGPID) taskcoach_$(TCVERSION)-0ubuntu18~bionic-1_source.changes
# Split PPA by version because the upload has a tendency to fail so the buildbot must retry
......@@ -140,6 +148,12 @@ ppa_rel_vivid:
ppa_rel_wily:
cd build-wily; dput ppa:taskcoach-developers/release-snapshot taskcoach_$(TCVERSION)-0ubuntu15~wily-1_source.changes
ppa_rel_xenial:
cd build-xenial; dput ppa:taskcoach-developers/release-snapshot taskcoach_$(TCVERSION)-0ubuntu16~xenial-1_source.changes
ppa_rel_bionic:
cd build-bionic; dput ppa:taskcoach-developers/release-snapshot taskcoach_$(TCVERSION)-0ubuntu18~bionic-1_source.changes
ppa_relnext_precise:
cd build-precise; dput ppa:taskcoach-developers/nextrelease-snapshot taskcoach_$(TCVERSION)-0ubuntu12~precise-1_source.changes
......@@ -152,6 +166,12 @@ ppa_relnext_vivid:
ppa_relnext_wily:
cd build-wily; dput ppa:taskcoach-developers/nextrelease-snapshot taskcoach_$(TCVERSION)-0ubuntu15~wily-1_source.changes
ppa_relnext_xenial:
cd build-xenial; dput ppa:taskcoach-developers/nextrelease-snapshot taskcoach_$(TCVERSION)-0ubuntu16~xenial-1_source.changes
ppa_relnext_bionic:
cd build-bionic; dput ppa:taskcoach-developers/nextrelease-snapshot taskcoach_$(TCVERSION)-0ubuntu18~bionic-1_source.changes
ppa_release_precise:
cd build-precise; dput ppa:taskcoach-developers/ppa taskcoach_$(TCVERSION)-0ubuntu12~precise-1_source.changes
......@@ -164,6 +184,12 @@ ppa_release_vivid:
ppa_release_wily:
cd build-wily; dput ppa:taskcoach-developers/ppa taskcoach_$(TCVERSION)-0ubuntu15~wily-1_source.changes
ppa_release_xenial:
cd build-xenial; dput ppa:taskcoach-developers/ppa taskcoach_$(TCVERSION)-0ubuntu16~xenial-1_source.changes
ppa_release_bionic:
cd build-bionic; dput ppa:taskcoach-developers/ppa taskcoach_$(TCVERSION)-0ubuntu18~bionic-1_source.changes
app: prepare
$(PYTHON) pymake.py py2app
chmod 644 "build/Task Coach/TaskCoach.app/Contents/Resources/taskcoach.py"
......@@ -180,7 +206,9 @@ dmgbase:
dmg: dmg-goodies dmgbase
dmg-signed: dmg-goodies
codesign -f -s "Developer ID Application" -r='designated => certificate leaf[field.1.2.840.113635.100.6.1.13] and identifier "org.pythonmac.unspecified.TaskCoach"' "build/Task Coach/TaskCoach.app"
for target in Contents/Frameworks/*.dylib Contents/Frameworks/Python.framework Contents/MacOS/python .; do \
codesign -f --verify --verbose --sign "Mac Developer:" --entitlements TaskCoach.entitlements "build/Task Coach/TaskCoach.app/$$target"; \
done
make dmgbase
winpenpack: py2exe
......@@ -295,4 +323,4 @@ reallyclean:
rm -rf $(CLEANFILES) $(REALLYCLEANFILES)
nuke:
$(PYTHON) nuke.py
hg purge --all
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key> <false />
</dict>
</plist>
......@@ -9,7 +9,7 @@
<summary>Your Friendly Task Manager</summary>
<summary xml:lang="fr">Your Friendly Task Manager</summary>
<description>
<p>Task Coach is an open source todo manager to manager personal tasks and todo lists. It supports composite tasks, i.e. tasks within tasks. In addition, Task Coach allows you to categorize your tasks, track efforts against a budget per task, and much more. Task Coach is available for Windows, Mac OS X, BSD, Linux, iPhone and iPad.</p>
<p>Task Coach is an open source todo manager to manage personal tasks and todo lists. It supports composite tasks, i.e. tasks within tasks. In addition, Task Coach allows you to categorize your tasks, track efforts against a budget per task, and much more. Task Coach is available for Windows, Mac OS X, BSD, Linux, iPhone and iPad.</p>
<p>Your database may be synchronized across these platforms. If espeak is installed, reminders can be spoken.</p>
<p xml:lang="fr">Task Coach est un gestionnaire de tâches libre pour gérer vos tâches et listes de choses à faire. Il supporte les tâches composites, càd les tâches faisant partie d'une autre. De plus, Task Coach vous permet de catégoriser vos tâches, suivre le temps passé par rapport à un budget associé à chaque tâche, et bien plus. Task Coach est disponible pour Windows, Mac OS X, BSD, Linux, iPhone et iPad.</p>
<p xml:lang="fr">Votre base de données peut être synchronisée à travers toutes ces plate-formes. Si espeak est installé, les rappels peuvent être énoncés.</p>
......@@ -19,5 +19,12 @@
<screenshot width="1280" height="748">http://www.taskcoach.org/screenshots/Appdata-02.png</screenshot>
</screenshots>
<url type="homepage">http://www.taskcoach.org/</url>
<url type="bugtracker">http://sourceforge.net/p/taskcoach/bugs</url>
<url type="faq">https://answers.launchpad.net/taskcoach/+faqs</url>
<url type="help">http://taskcoach.wikispaces.com/Task+Coach+Manual</url>
<url type="donation">http://www.taskcoach.org/givesupport.html</url>
<provides>
<binary>taskcoach.py</binary>
</provides>
<updatecontact>developers@taskcoach.org</updatecontact>
</application>
......@@ -34,6 +34,7 @@ BuildArch: noarch
Requires: python >= %(pythonversion)s
Requires: wxPython >= %(wxpythonversionnumber)s
Requires: python-twisted >= %(twistedversionnumber)s
Requires: python-igraph >= %(igraphversionnumber)s
# Depend on libXScrnSaver for libXss
Requires: libXScrnSaver >= 1.2.0
......
......@@ -33,6 +33,7 @@ BuildArch: noarch
Requires: python >= %(pythonversion)s
Requires: python-wxGTK >= %(wxpythonversionnumber)s
Requires: python-twisted >= %(twistedversionnumber)s
Requires: python-igraph >= %(igraphversionnumber)s
# Must have setuptools to build the package
BuildRequires: python-setuptools
......
......@@ -19,14 +19,14 @@
c = BuildmasterConfig = {}
BASEURL = 'https://svn.code.sf.net/p/taskcoach/code/'
REPOURL = 'http://hg.code.sf.net/p/taskcoach/repo'
PASSWORD = file('.passwd', 'rb').readlines()[0].strip()
USERPASSWORD = file('.userpasswd', 'rb').readlines()[0].strip()
# Warning: put release branch first.
BRANCHES = [
('Release1_3_Branch', 'LastRelease', 'rel'),
('Release1_4_Branch', 'LastRelease', 'rel'),
('trunk', 'Trunk', 'trunk'),
]
......@@ -54,25 +54,24 @@ c['slavePortnum'] = 9989
#from buildbot.changes.pb import PBChangeSource
#c['change_source'] = PBChangeSource()
from buildbot.changes.svnpoller import SVNPoller, split_file_branches
c['change_source'] = SVNPoller(BASEURL,
pollinterval=10*60,
split_file=split_file_branches)
from buildbot.changes.hgpoller import HgPoller
c['change_source'] = []
####### SCHEDULERS
from buildbot.scheduler import Scheduler, Triggerable
from buildbot.scheduler import Triggerable
from buildbot.schedulers.basic import SingleBranchScheduler
c['schedulers'] = []
forceBuilders = ['Release']
for branchName, longName, shortName in BRANCHES:
branch = None if branchName == 'trunk' else 'branches/%s' % branchName
branch = None if branchName == 'trunk' else branchName
for platform in ['Win32', 'Ubuntu10', 'Fedora14', 'OpenSuse', 'MacOS']:
c['schedulers'].append(Scheduler(name='%s%s' % (longName, platform),
branch=branch,
treeStableTimer=0,
builderNames=['%s-%s' % (platform.lower(), shortName)]))
c['schedulers'].append(SingleBranchScheduler(name='%s%s' % (longName, platform),
branch=branch,
treeStableTimer=0,
builderNames=['%s-%s' % (platform.lower(), shortName)]))
forceBuilders.append('%s-%s' % (platform.lower(), shortName))
# Release schedulers
......@@ -94,8 +93,8 @@ import tcbuild
reload(tcbuild)
from buildbot.process import factory
from buildbot.steps.source import SVN
from buildbot.steps.shell import Compile
from buildbot.steps.source import Mercurial
from buildbot.steps.shell import Compile, SetPropertyFromCommand
c['builders'] = []
......@@ -120,6 +119,7 @@ c['builders'] = []
def addCommonStartSteps(f, skipUnitTests=False, skipIntegrationTests=False, **kwargs):
f.addStep(tcbuild.Revert(**kwargs))
f.addStep(tcbuild.Cleanup(**kwargs))
f.addStep(SetPropertyFromCommand(command='hg identify -n', property='got_revision_number'))
f.addStep(tcbuild.Revision(**kwargs))
if not skipUnitTests:
f.addStep(tcbuild.UnitTests(**kwargs))
......@@ -140,16 +140,23 @@ c['builders'].append(dict(name='Release', slavename='Release',
builddir='release', factory=f))
for branchName, longName, shortName in BRANCHES:
svnargs=dict(svnurl=BASEURL + 'trunk') if branchName == 'trunk' else dict(baseURL=BASEURL)
svnargs['retry'] = (30, 5)
hgargs = dict(repourl=REPOURL, branchType='inrepo')
workdir = 'build/taskcoach'
branch = 'default' if branchName == 'trunk' else branchName
source = HgPoller(REPOURL,
pollinterval=10*60,
workdir='hgpoller-%s' % branch,
branch=branch)
source.setName('poller-%s' % branch)
c['change_source'].append(source)
# Win32
f = factory.BuildFactory()
f.addStep(SVN(**svnargs))
f.addStep(Mercurial(**hgargs))
addCommonStartSteps(f, workdir=workdir, skipUnitTests=True)
f.addStep(tcbuild.BuildSourceZip(workdir=workdir))
f.addStep(tcbuild.UploadSourceZip(workdir=workdir))
......@@ -171,8 +178,8 @@ for branchName, longName, shortName in BRANCHES:
f = factory.BuildFactory()
f.addStep(SVN(**svnargs))
addCommonStartSteps(f, workdir=workdir)
f.addStep(Mercurial(**hgargs))
addCommonStartSteps(f, workdir=workdir, skipUnitTests=True)
if shortName == 'rel':
f.addStep(tcbuild.LanguageTests(workdir=workdir))
f.addStep(tcbuild.Epydoc(workdir=workdir))
......@@ -192,8 +199,8 @@ for branchName, longName, shortName in BRANCHES:
f.addStep(tcbuild.PPA(name='relnext', workdir=workdir))
f.addStep(tcbuild.PylintStep(workdir=workdir))
f.addStep(tcbuild.PylintUploadStep(workdir=workdir))
f.addStep(tcbuild.Coverage(workdir=workdir))
f.addStep(tcbuild.UploadCoverage(workdir=workdir))
## f.addStep(tcbuild.Coverage(workdir=workdir))
## f.addStep(tcbuild.UploadCoverage(workdir=workdir))
addCommonEndSteps(f, workdir=workdir)
c['builders'].append(dict(name='ubuntu10-%s' % shortName,
......@@ -205,7 +212,7 @@ for branchName, longName, shortName in BRANCHES:
f = factory.BuildFactory()
f.addStep(SVN(**svnargs))
f.addStep(Mercurial(**hgargs))
addCommonStartSteps(f, workdir=workdir)
f.addStep(tcbuild.BuildRPM(workdir=workdir))
f.addStep(tcbuild.UploadRPM(workdir=workdir))
......@@ -228,7 +235,7 @@ for branchName, longName, shortName in BRANCHES:
f = factory.BuildFactory()
f.addStep(SVN(**svnargs))
f.addStep(Mercurial(**hgargs))
addCommonStartSteps(f, skipUnitTests=True, skipIntegrationTests=True, workdir=workdir)
f.addStep(tcbuild.BuildOpenSuse(workdir=workdir))
f.addStep(tcbuild.UploadOpenSuse(workdir=workdir))
......@@ -242,7 +249,7 @@ for branchName, longName, shortName in BRANCHES:
f = factory.BuildFactory()
f.addStep(SVN(**svnargs))
f.addStep(Mercurial(**hgargs))
addCommonStartSteps(f, skipUnitTests=True, skipIntegrationTests=True, workdir=workdir)
f.addStep(tcbuild.BuildDMG(workdir=workdir))
f.addStep(tcbuild.UploadDMG(workdir=workdir))
......@@ -256,7 +263,7 @@ for branchName, longName, shortName in BRANCHES:
####### Release
f = factory.BuildFactory()
f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))
f.addStep(Mercurial(repourl=REPOURL, defaultBranch=BRANCHES[0][0], branchType='inrepo'))
f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))
f.addStep(tcbuild.BuildDMG(workdir='build/taskcoach'))
f.addStep(tcbuild.UploadDMG(workdir='build/taskcoach'))
......@@ -265,7 +272,7 @@ c['builders'].append(dict(name='macos-release', slavename='MacOS',
builddir='release-macos', factory=f))
f = factory.BuildFactory()
f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))
f.addStep(Mercurial(repourl=REPOURL, defaultBranch=BRANCHES[0][0], branchType='inrepo'))
f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))
f.addStep(tcbuild.BuildEXE(workdir='build/taskcoach'))
f.addStep(tcbuild.UploadEXE(workdir='build/taskcoach'))
......@@ -280,7 +287,7 @@ c['builders'].append(dict(name='windows-release', slavename='WinXPSP3',
builddir='release-windows', factory=f))
f = factory.BuildFactory()
f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))
f.addStep(Mercurial(repourl=REPOURL, defaultBranch=BRANCHES[0][0], branchType='inrepo'))
f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))
f.addStep(tcbuild.BuildDEB(workdir='build/taskcoach'))
f.addStep(tcbuild.UploadDEB(workdir='build/taskcoach'))
......@@ -296,7 +303,7 @@ c['builders'].append(dict(name='ubuntu10-release', slavename='Ubuntu10',
builddir='release-ubuntu10', factory=f))
f = factory.BuildFactory()
f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))
f.addStep(Mercurial(repourl=REPOURL, defaultBranch=BRANCHES[0][0], branchType='inrepo'))
f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))
f.addStep(tcbuild.BuildRPM(workdir='build/taskcoach'))
f.addStep(tcbuild.UploadRPM(workdir='build/taskcoach'))
......@@ -311,7 +318,7 @@ c['builders'].append(dict(name='fedora14-release', slavename='Fedora14',
builddir='release-fedora14', factory=f))
f = factory.BuildFactory()
f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))
f.addStep(Mercurial(repourl=REPOURL, defaultBranch=BRANCHES[0][0], branchType='inrepo'))
f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))
f.addStep(tcbuild.BuildOpenSuse(workdir='build/taskcoach'))
f.addStep(tcbuild.UploadOpenSuse(workdir='build/taskcoach'))
......@@ -320,7 +327,7 @@ c['builders'].append(dict(name='opensuse-release', slavename='OpenSuse',
builddir='release-opensuse', factory=f))
f = factory.BuildFactory()
f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))
f.addStep(Mercurial(repourl=REPOURL, defaultBranch=BRANCHES[0][0], branchType='inrepo'))
f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))
f.addStep(tcbuild.PPA(workdir='build/taskcoach', name='release'))
......@@ -366,4 +373,4 @@ c['user_managers'].append(manual.CommandlineUserManager(username="taskcoach",
c['projectName'] = "TaskCoach"
c['projectURL'] = "http://www.taskcoach.org/"
c['buildbotURL'] = "http://www.fraca7.net:8010/"
c['buildbotURL'] = "http://jeromelaheurte.net:8010/"
......@@ -45,7 +45,7 @@ class Revert(Compile):
name = 'Revert'
description = ['Reverting', 'locally', 'modified', 'files']
descriptionDone = ['Local', 'changes', 'reverted']
command = ['svn', 'revert', '-R', '.']
command = ['hg', 'revert', '.']
class Cleanup(Compile):
......@@ -67,7 +67,7 @@ class Revision(Compile):
name = 'Revision'
description = ['Generating', 'revision', 'file']
descriptionDone = ['Revision', 'file', 'generated']
command = ['make', 'revision', WithProperties('TCREV=%s', 'got_revision')]
command = ['make', 'revision', WithProperties('TCREV=%s', 'got_revision_number')]
#==============================================================================
......@@ -135,7 +135,7 @@ class Coverage(Compile):
Compile.createSummary(self, log)
self.addURL('coverage',
'http://www.fraca7.net/TaskCoach-coverage/%s/index.html' % (self.getProperty('buildername')))
'http://jeromelaheurte.net/TaskCoach-coverage/%s/index.html' % (self.getProperty('buildername')))
class UploadCoverage(DirectoryUpload):
......@@ -163,7 +163,7 @@ class UploadDoc(DirectoryUpload):
DirectoryUpload.start(self)
self.addURL('Documentation',
'http://www.fraca7.net/TaskCoach-doc/%s/index.html' % (self.getProperty('buildername')))
'http://jeromelaheurte.net/TaskCoach-doc/%s/index.html' % (self.getProperty('buildername')))
......@@ -181,7 +181,7 @@ class DistCompile(Compile):
if self.getProperty('release'):
self.command = ['make', self.target or self.name]
else:
self.command = ['make', self.target or self.name, 'TCREV=%s' % self.getProperty('got_revision')]
self.command = ['make', self.target or self.name, 'TCREV=%s' % self.getProperty('got_revision_number')]
Compile.start(self)
......@@ -210,7 +210,7 @@ class DistCompile(Compile):
class UploadBase(FileUpload):
def __init__(self, **kwargs):
kwargs['slavesrc'] = WithProperties('%s', 'filename')
kwargs['masterdest'] = WithProperties('/var/www/TaskCoach-packages/%s/%s', 'branch', 'basefilename')
kwargs['masterdest'] = WithProperties('/var/www/TaskCoach-packages/branches/%s/%s', 'branch', 'basefilename')
kwargs['mode'] = 0644
FileUpload.__init__(self, **kwargs)
......@@ -221,8 +221,8 @@ class UploadBase(FileUpload):
FileUpload.start(self)
if not self.getProperty('release'):
url = 'http://www.fraca7.net/TaskCoach-packages/%s/%s' % (self.getProperty('branch') or '',
self.getProperty('basefilename'))
url = 'http://jeromelaheurte.net/TaskCoach-packages/branches/%s/%s' % (self.getProperty('branch') or '',
self.getProperty('basefilename'))
self.addURL('Download', url)
......@@ -230,7 +230,7 @@ class UploadBase(FileUpload):
class UploadChangelog(FileUpload):
def __init__(self, **kwargs):
kwargs['slavesrc'] = 'changelog_content'
kwargs['masterdest'] = WithProperties('/var/www/TaskCoach-packages/%s/changelog_content', 'branch')
kwargs['masterdest'] = WithProperties('/var/www/TaskCoach-packages/branches/%s/changelog_content', 'branch')
kwargs['mode'] = 0644
FileUpload.__init__(self, **kwargs)
......@@ -340,6 +340,11 @@ class BuildDEB(DistCompile):
description = ['Generating', 'Debian', 'package']
descriptionDone = ['Debian', 'package']
def __init__(self, **kwargs):
# Avoid having the virtualenv bin directory in path, it messes up things
kwargs['env'] = {'PATH': '/bin:/usr/bin:/usr/local/bin'}
super(DistCompile, self).__init__(**kwargs)
class BuildUbuntu(BuildDEB):
filename_rx = re.compile(r'^moving build/(taskcoach_.*_all)\.deb')
......@@ -440,7 +445,7 @@ class ZipReleaseStep(MasterShellCommand):
def start(self):
MasterShellCommand.start(self)
self.addURL('Download release', 'http://www.fraca7.net/TaskCoach-packages/release/release.zip')
self.addURL('Download release', 'http://jeromelaheurte.net/TaskCoach-packages/release/release.zip')
# Pylint
......@@ -461,4 +466,4 @@ class PylintUploadStep(FileUpload):
def start(self):
FileUpload.start(self)
self.addURL('See', 'http://www.fraca7.net/pylint-%s.html' % self.getProperty('buildername'))
self.addURL('See', 'http://jeromelaheurte.net/pylint-%s.html' % self.getProperty('buildername'))
......@@ -22,10 +22,10 @@
{% set item_class=cycler('alt', '') %}
<li class="{{ item_class.next() }}"><a
href="http://www.fraca7.net/TaskCoach-packages/latest_bugfixes.py">Latest
href="http://jeromelaheurte.net/TaskCoach-packages/latest_bugfixes.py">Latest
bugfix packages</a>.</li>
<li class="{{ item_class.next() }}"><a href="http://www.fraca7.net/TaskCoach-packages/latest.py">All
<li class="{{ item_class.next() }}"><a href="http://jeromelaheurte.net/TaskCoach-packages/latest.py">All
latest packages</a> grouped by branch.</li>
<li class="{{ item_class.next() }}">The <a href="waterfall">Waterfall Display</a> will give you a
......
......@@ -3,7 +3,7 @@ from twisted.application import service
from buildslave.bot import BuildSlave
basedir = r'/home/jerome/Buildslave'
host = '192.168.1.2'
host = 'jeromelaheurte.net'
port = 9989
slavename = 'Fedora14'
passwd = file('.passwd', 'rb').readlines()[0].strip()
......
......@@ -3,7 +3,7 @@ from twisted.application import service
from buildslave.bot import BuildSlave
basedir = r'/Users/fraca7/Buildslave'
buildmaster_host = '192.168.1.2'
buildmaster_host = 'jeromelaheurte.net'
port = 9989
slavename = 'MacOS'
passwd = file('.passwd', 'rb').readlines()[0].strip()
......
......@@ -3,7 +3,7 @@ from twisted.application import service
from buildslave.bot import BuildSlave
basedir = r'/home/jerome/Buildslave'
host = '192.168.1.2'
host = 'jeromelaheurte.net'
port = 9989
slavename = 'OpenSuse'
passwd = file('.passwd', 'rb').readlines()[0].strip()
......
......@@ -3,7 +3,7 @@ from twisted.application import service
from buildslave.bot import BuildSlave
basedir = r'/home/jerome/Buildslave_Release'
host = '192.168.1.2'
host = 'jeromelaheurte.net'
port = 9989
slavename = 'Release'
passwd = file('.passwd', 'rb').readlines()[0].strip()
......
......@@ -2,8 +2,8 @@
from twisted.application import service
from buildslave.bot import BuildSlave
basedir = r'/home/jerome/Buildslave_Ubuntu10'
host = '192.168.1.2'
basedir = '.'
host = 'jeromelaheurte.net'
port = 9989
slavename = 'Ubuntu10'
passwd = file('.passwd', 'rb').readlines()[0].strip()
......
......@@ -3,7 +3,7 @@ from twisted.application import service
from buildslave.bot import BuildSlave
basedir = r'c:\dev\buildslave'
buildmaster_host = '192.168.1.2'
buildmaster_host = 'jeromelaheurte.net'
port = 9989
slavename = 'WinXPSP3'
passwd = file('.passwd', 'rb').readlines()[0].strip()
......
......@@ -117,7 +117,7 @@ class bdist_deb(Command, object):
if not self.distribution:
self.distribution = 'UNRELEASED'
if not self.wxpythonversion:
self.wxpythonversion = '2.8'
self.wxpythonversion = '3.0'
if not self.twistedversion:
self.twistedversion = '12.1'
if not self.pythonversion:
......@@ -188,7 +188,7 @@ class bdist_deb(Command, object):
def write_debian_files(self):
''' Create the different package files in the debian folder. '''
debian_files = dict(rules=rules, compat='5\n', pycompat='2\n',
debian_files = dict(rules=rules, compat='9\n',
menu=menu, control=control, copyright=self.copyright_contents(),
changelog=changelog)
for filename, contents in debian_files.iteritems():
......@@ -228,14 +228,12 @@ class bdist_deb(Command, object):
rules = '''#!/usr/bin/make -f
DEB_PYTHON_SYSTEM := pysupport
DEB_PYTHON2_MODULE_PACKAGES=taskcoach
include /usr/share/cdbs/1/rules/simple-patchsys.mk
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/python-distutils.mk
binary-install/taskcoach::
\tdh_desktop
\tdh_icons
'''
......@@ -250,14 +248,13 @@ control = '''Source: %(package)s
Section: %(section)s
Priority: %(priority)s
Maintainer: %(maintainer)s <%(maintainer_email)s>
Build-Depends: cdbs (>= 0.4.43), debhelper (>= 5), python, dpatch
Build-Depends-Indep: python-support (>= 0.5.3)
Standards-Version: 3.7.3
Build-Depends: cdbs (>= 0.4.43), debhelper (>= 5), python, devscripts, dh-python
Standards-Version: 4.1.1
Homepage: %(url)s
Package: %(package)s
Architecture: %(architecture)s
Depends: python (>= %(pythonversion)s), python-wxgtk2.8 (>= %(wxpythonversion)s), python-wxversion, python-twisted (>= %(twistedversion)s), libxss1, ttf-dejavu, xdg-utils
Depends: python (>= %(pythonversion)s), python-wxgtk3.0 (>= %(wxpythonversion)s), python-wxversion, python-twisted (>= %(twistedversion)s), libxss1, ttf-dejavu, xdg-utils, python-igraph
Recommends: python-notify, libgnome2-0, libavahi-compat-libdnssd1, x11-utils
Suggests: python-kde4
Description: %(description)s.
......
......@@ -26,7 +26,7 @@ class bdist_portable_base(Command, object):
''' Base class for bdist commands that create portable distributions. '''
def copy_files(self, src_dir, dest_dir, copy_recursively=False):
if src_dir.endswith('.svn'):
if src_dir.endswith('.hg'):
return
if not os.path.exists(dest_dir):
os.mkdir(dest_dir)
......@@ -50,4 +50,4 @@ class bdist_portable_base(Command, object):
dest_file = file(dest_filename, 'wb')
dest_file.write(contents)
dest_file.close()
\ No newline at end of file
* TaskCoach would not start on Fedora 23 using LXDE. This probably concerns
other distributions as well.
* Reminders would fire randomly or not at all.
* Per-task effort total time consolidation, patch provided by
rogerdc@gmail.com
* Add a viewer for task dependencies based on igraph (contributed by
Matthias Tafelmeier). Not available on all platforms.
* Task Coach now uses Mercurial for version control. This only affects you
if you want to develop or use Task Coach source code.
......@@ -22,6 +22,24 @@ from changetypes import *
releases = [
Release('1.4.4', 'December 2, 2018',
summary='''This is a mixed feature and bugfix release.''',
bugsFixed=[
Bugv2('''TaskCoach would not start on Fedora 23 using LXDE. This probably
concerns other distributions as well.'''),
Bugv2('''Reminders would fire randomly or not at all.'''),
],
featuresAdded=[
Feature('''Per-task effort total time consolidation, patch provided by rogerdc@gmail.com'''),
Feature('''Add a viewer for task dependencies based on igraph (contributed
by Matthias Tafelmeier). Not available on all platforms.'''),
],
dependenciesChanged=[
Dependency('''Task Coach now uses Mercurial for version control. This
only affects you if you want to develop or use Task Coach source code.'''),
],
),
Release('1.4.3', 'January 31, 2016',
summary='''This is a mixed feature and bugfix release.''',
featuresAdded=[
......
taskcoach (1.4.3-9) UNRELEASED; urgency=medium
taskcoach (1.4.4-1) unstable; urgency=medium
* New upstream release.
Depend on python-igraph.
Remove new generated files when repackaging.
* Fix installation path for appdata.xml.
* Drop obsolete version restrictions in dependencies.
* Standards-Version: 4.2.1.
* Rules-Requires-Root: no.
* Replace more HTTP with HTTPS.
* Replace more ADTTMP with AUTOPKGTEST_TMP.
* Remove unused options from watch file.
[ Ondřej Nový <onovy@debian.org> ]
* d/tests: Use AUTOPKGTEST_TMP instead of ADTTMP
* d/watch: Use https protocol
-- Ondřej Nový <onovy@debian.org> Mon, 01 Oct 2018 10:02:10 +0200
-- Nicolas Boulenguez <nicolas@debian.org> Sat, 15 Dec 2018 14:13:29 +0100
taskcoach (1.4.3-8) unstable; urgency=medium
......
......@@ -4,16 +4,16 @@ Priority: optional
Maintainer: Nicolas Boulenguez <nicolas@debian.org>
Build-Depends-Indep: debhelper (>= 11),
# 2.6.6-3~: https://wiki.debian.org/Python/TransitionToDHPython2
python (>= 2.6.6-3~),
python,
dh-python,
# See debian/rules:
graphicsmagick,
# Unit tests have the same dependencies than the installed package.
python-chardet (>= 2.1.1),
python-dateutil (>= 1.5),
python-dateutil,
python-keyring (>= 3.7),
python-lockfile (>= 0.9),
python-pyparsing (>= 1.5.5),
python-pyparsing,
python-squaremap (>= 1.0.3),
python-xdg (>= 0.25),
# Version modifying the path in official_agw.diff.
......@@ -25,8 +25,9 @@ Build-Depends-Indep: debhelper (>= 11),
# See tests/control.
hicolor-icon-theme, locales-all, x11-utils, xauth, xvfb
# Also see patches/run_img2py_inside_xvfb.diff.
Standards-Version: 4.1.4
Homepage: http://www.taskcoach.org
Standards-Version: 4.2.1
Rules-Requires-Root: no
Homepage: https://www.taskcoach.org
Vcs-Browser: https://salsa.debian.org/debian/taskcoach
Vcs-Git: https://salsa.debian.org/debian/taskcoach.git
......@@ -37,10 +38,11 @@ Depends: ${misc:Depends}, ${python:Depends},
x11-utils,
# See debian/copyright
python-chardet (>= 2.1.1),
python-dateutil (>= 1.5),
python-dateutil,
python-igraph,
python-keyring (>= 3.7),
python-lockfile (>= 0.9),
python-pyparsing (>= 1.5.5),
python-pyparsing,
python-squaremap (>= 1.0.3),
python-xdg (>= 0.25),
# See buildlib/bdist_deb.py and #762413
......
......@@ -2,13 +2,44 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: taskcoach
Upstream-Contact: Task Coach developers <developers@taskcoach.org>
Files-Excluded:
*.pyc
.hgignore
CHANGES.txt
INSTALL.txt
LICENSE.txt
MANIFEST
README.txt
build
build.in/portableapps
build.in/winpenpack
dist
dist.in
extension
i18n.in/messages.pot
taskcoachlib/bin.in
taskcoachlib/gui/icons.py
taskcoachlib/i18n/??.py
taskcoachlib/i18n/???.py
taskcoachlib/i18n/??_??.py
taskcoachlib/persistence/xml/templates.py
taskcoachlib/thirdparty/aui
taskcoachlib/thirdparty/chardet
taskcoachlib/thirdparty/combotreebox.py
taskcoachlib/thirdparty/customtreectrl.py
taskcoachlib/thirdparty/dateutil
taskcoachlib/thirdparty/desktop
taskcoachlib/thirdparty/gntp
taskcoachlib/thirdparty/hypertreelist.py
taskcoachlib/thirdparty/keyring
taskcoachlib/thirdparty/lockfile
taskcoachlib/thirdparty/ntlm
taskcoachlib/thirdparty/pubsub
taskcoachlib/thirdparty/pybonjour.py
taskcoachlib/thirdparty/pyparsing.py
taskcoachlib/thirdparty/squaremap
taskcoachlib/thirdparty/wmi.py
taskcoachlib/thirdparty/wxScheduler
taskcoachlib/thirdparty/xdg
tests/disttests/win32/sendinput/sendinput.pyd
thirdparty/PyPubSub-*
thirdparty/SquareMap-*.tar.gz
......@@ -20,12 +51,12 @@ Files-Excluded:
thirdparty/pyparsing-*.tar.gz
thirdparty/python-dateutil-*.tar.gz
thirdparty/pyxdg-*.tar.gz
tools/webchecker.py
tools/img2img.py
tools/img2py.py
tools/pygettext.py
tools/webchecker.py
website.in
Source: http://www.taskcoach.org
Source: https://www.taskcoach.org
Upstream provides many tarballs. We use
the "raw source tar archive". Please see debian/watch for details.
.
......@@ -91,7 +122,7 @@ Source: http://www.taskcoach.org
a patch does the rest.
Files: *
Copyright: 2004-2016 Task Coach developers <developers@taskcoach.org>
Copyright: 2004-2018 Task Coach developers <developers@taskcoach.org>
2014 Joseph Wang https://sourceforge.net/u/drjoe/profile
2014 Tom Monaco http://www.thomasmonaco.com
2013 Ivan Romanov <https://sourceforge.net/u/ivanromanov/>
......@@ -111,10 +142,11 @@ Copyright: 2004-2016 Task Coach developers <developers@taskcoach.org>
2005-2013 Rosetta Contributors and Canonical Ltd
2014 Manab Chetia <manab.chetia@outlook.com>
2015 Nicola https://sourceforge.net/u/swisscarbon/profile
2016 Roger (rogerdc@gmail.com)
License: GPL-3+
Files: build.in/debian/taskcoach.appdata.xml
Copyright: 2014 Task Coach developers <developers@taskcoach.org>
Copyright: 2014-2018 Task Coach developers <developers@taskcoach.org>
License: CC0-1.0
See /usr/share/common-licenses/CC0-1.0.
......@@ -150,7 +182,7 @@ License: MIT
Comment: See taskcoachlib/thirdparty/README.txt.
Files: taskcoachlib/thirdparty/smartdatetimectrl.py
Copyright: 2012-2012 Jerome Laheurte <fraca7@free.fr>
Copyright: 2012-2018 Jerome Laheurte <fraca7@free.fr>
2012-2012 Frank Niessink <frank@niessink.com>
License: GPL-3+
Comment: See taskcoachlib/thirdparty/README.txt.
......
......@@ -18,13 +18,7 @@ Author: Nicolas Boulenguez <nicolas@debian.org>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0+</project_license>
<name>Task Coach</name>
@@ -9,15 +9,27 @@
<summary>Your Friendly Task Manager</summary>
<summary xml:lang="fr">Your Friendly Task Manager</summary>
<description>
- <p>Task Coach is an open source todo manager to manager personal tasks and todo lists. It supports composite tasks, i.e. tasks within tasks. In addition, Task Coach allows you to categorize your tasks, track efforts against a budget per task, and much more. Task Coach is available for Windows, Mac OS X, BSD, Linux, iPhone and iPad.</p>
+ <p>Task Coach is an open source todo manager to manage personal tasks and todo lists. It supports composite tasks, i.e. tasks within tasks. In addition, Task Coach allows you to categorize your tasks, track efforts against a budget per task, and much more. Task Coach is available for Windows, Mac OS X, BSD, Linux, iPhone and iPad.</p>
<p>Your database may be synchronized across these platforms. If espeak is installed, reminders can be spoken.</p>
@@ -14,9 +14,14 @@
<p xml:lang="fr">Task Coach est un gestionnaire de tâches libre pour gérer vos tâches et listes de choses à faire. Il supporte les tâches composites, càd les tâches faisant partie d'une autre. De plus, Task Coach vous permet de catégoriser vos tâches, suivre le temps passé par rapport à un budget associé à chaque tâche, et bien plus. Task Coach est disponible pour Windows, Mac OS X, BSD, Linux, iPhone et iPad.</p>
<p xml:lang="fr">Votre base de données peut être synchronisée à travers toutes ces plate-formes. Si espeak est installé, les rappels peuvent être énoncés.</p>
</description>
......@@ -40,27 +34,21 @@ Author: Nicolas Boulenguez <nicolas@debian.org>
+ </screenshot>
</screenshots>
<url type="homepage">http://www.taskcoach.org/</url>
- <updatecontact>developers@taskcoach.org</updatecontact>
<url type="bugtracker">http://sourceforge.net/p/taskcoach/bugs</url>
@@ -27,4 +32,4 @@
<binary>taskcoach.py</binary>
</provides>
<updatecontact>developers@taskcoach.org</updatecontact>
-</application>
+ <url type="bugtracker">http://sourceforge.net/p/taskcoach/bugs</url>
+ <url type="faq">https://answers.launchpad.net/taskcoach/+faqs</url>
+ <url type="help">http://taskcoach.wikispaces.com/Task+Coach+Manual</url>
+ <url type="donation">http://www.taskcoach.org/givesupport.html</url>
+ <provides>
+ <binary>taskcoach.py</binary>
+ </provides>
+ <update_contact>developers@taskcoach.org</update_contact>
+</component>
--- a/setup.py
+++ b/setup.py
@@ -80,9 +80,8 @@
@@ -80,7 +80,7 @@
current_dist = [dist.lower() for dist in platform.dist()]
if 'debian' in current_dist or 'ubuntu' in current_dist:
setupOptions['data_files'] = [('share/applications', ['build.in/linux_common/taskcoach.desktop']),
- ('share/appdata', ['build.in/debian/taskcoach.appdata.xml']),
+ ('share/metainfo', ['build.in/debian/taskcoach.appdata.xml']),
('share/pixmaps', ['icons.in/taskcoach.png'])]
- if 'ubuntu' in current_dist:
- setupOptions['data_files'].append(('share/appdata', ['build.in/debian/taskcoach.appdata.xml']))
elif system == 'Windows':
setupOptions['scripts'].append('taskcoach.pyw')
major, minor = majorAndMinorPythonVersion()
Description: use gtk3 notification when available
Origin: https://sourceforge.net/p/taskcoach/bugs/1593
Bug-Debian: https://bugs.debian.org/897380
--- a/taskcoachlib/gui/printer.py
+++ b/taskcoachlib/gui/printer.py
@@ -25,8 +25,9 @@
# Prepare for printing. On Jolicloud, printing crashes unless we do this:
if operating_system.isGTK():
try:
- import gtk # pylint: disable=F0401
- gtk.remove_log_handlers()
+ if 'gtk3' not in wx.PlatformInfo:
+ import gtk # pylint: disable=F0401
+ gtk.remove_log_handlers()
except ImportError:
pass
--- a/taskcoachlib/notify/notifier_libnotify.py
+++ b/taskcoachlib/notify/notifier_libnotify.py
@@ -27,11 +27,17 @@
super(LibnotifyNotifier, self).__init__()
try:
- import pynotify
+ if 'gtk3' in wx.PlatformInfo:
+ import gi.repository.Notify
+ else:
+ import pynotify
except ImportError:
self.__notify = None
else:
- self.__notify = pynotify
+ if 'gtk3' in wx.PlatformInfo:
+ self.__notify = gi.repository.Notify
+ else:
+ self.__notify = pynotify
self.__notify.init(data.name)
def getName(self):
@@ -46,9 +52,14 @@
os.close(fd)
bitmap.SaveFile(filename, wx.BITMAP_TYPE_PNG)
try:
- n = self.__notify.Notification(title.encode('UTF-8'),
- summary.encode('UTF-8'),
- filename)
+ if 'gtk3' in wx.PlatformInfo:
+ n = self.__notify.Notification.new(title.encode('UTF-8'),
+ summary.encode('UTF-8'),
+ filename)
+ else:
+ n = self.__notify.Notification(title.encode('UTF-8'),
+ summary.encode('UTF-8'),
+ filename)
n.show()
finally:
os.remove(filename)
--- a/taskcoachlib/render.py
+++ b/taskcoachlib/render.py
@@ -29,6 +29,7 @@
import codecs
import locale
import re
+import wx
# pylint: disable=W0621
@@ -225,7 +226,8 @@
elif desktop.get_desktop() == 'KDE4':
try:
# Import gtk first because when it's imported indirectly it generates a RuntimeWarning.
- import gtk
+ if 'gtk3' not in wx.PlatformInfo:
+ import gtk
from PyKDE4.kdecore import KGlobal, KLocale
from PyQt4.QtCore import QTime, QDate
except ImportError:
--- a/taskcoachlib/thirdparty/smartdatetimectrl.py
+++ b/taskcoachlib/thirdparty/smartdatetimectrl.py
@@ -902,7 +902,8 @@
elif platform.system() == 'Linux':
try:
# Without this gtk import there's a warning if you try to import wx.lib.masked
- import gtk
+ if 'gtk3' not in wx.PlatformInfo:
+ import gtk
from PyKDE4.kdecore import KLocale, KGlobal
from PyQt4.QtCore import QTime
except ImportError:
Description: click help->faq returns "Cannot open URL: global name 'os' is not defined"
Author: Nicolas Boulenguez <nicolas@debian.org>
Bug-Debian: https://bugs.debian.org/835898
--- a/taskcoachlib/tools/openfile.py
+++ b/taskcoachlib/tools/openfile.py
@@ -17,6 +17,7 @@
'''
from taskcoachlib.thirdparty import desktop
+import os
import platform
def openFile(filename):
......@@ -8,7 +8,7 @@ Forwarded: not-needed
--- a/Makefile
+++ b/Makefile
@@ -210,8 +210,8 @@
@@ -238,8 +238,8 @@
cd thirdparty; tar xzf pyparsing-1.5.5.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty pyparsing-1.5.5/pyparsing_py2.py
mv taskcoachlib/thirdparty/pyparsing_py2.py taskcoachlib/thirdparty/pyparsing.py
cd thirdparty; tar xzf pybonjour-1.1.1.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty pybonjour-1.1.1/pybonjour.py
......
......@@ -71,7 +71,7 @@ Forwarded: not-needed
--- a/Makefile
+++ b/Makefile
@@ -205,7 +205,6 @@
@@ -233,7 +233,6 @@
cd thirdparty; tar xzf SquareMap-1.0.3.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty SquareMap-1.0.3/squaremap
cd thirdparty; tar xzf python-ntlm-40080cff37ab32570f9bb50bad0a46b957409c18.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty python-ntlm/ntlm
cd thirdparty; tar xzf wxScheduler-r151.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty wxScheduler/wxScheduler
......
......@@ -27,7 +27,7 @@ Forwarded: not-needed
from taskcoachlib.i18n import _
--- a/Makefile
+++ b/Makefile
@@ -196,7 +196,6 @@
@@ -224,7 +224,6 @@
templates: taskcoachlib/persistence/xml/templates.py
thirdpartymodules:
......
......@@ -16,7 +16,7 @@ Forwarded: not-needed
import StringIO
--- a/Makefile
+++ b/Makefile
@@ -197,7 +197,6 @@
@@ -225,7 +225,6 @@
thirdpartymodules:
cd thirdparty; tar xzf chardet-2.1.1.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty chardet-2.1.1/chardet
......
......@@ -34,7 +34,7 @@ Forwarded: not-needed
return _GetCachedPassword(domain, username, reset)
--- a/Makefile
+++ b/Makefile
@@ -199,7 +199,6 @@
@@ -227,7 +227,6 @@
cd thirdparty; tar xzf chardet-2.1.1.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty chardet-2.1.1/chardet
cd thirdparty; tar xzf python-dateutil-1.5.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty python-dateutil-1.5/dateutil
cd thirdparty; tar xzf desktop-0.4.2.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty desktop-0.4.2/desktop
......
......@@ -6,7 +6,7 @@ Forwarded: not-needed
--- a/Makefile
+++ b/Makefile
@@ -200,7 +200,6 @@
@@ -228,7 +228,6 @@
cd thirdparty; tar xzf python-dateutil-1.5.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty python-dateutil-1.5/dateutil
cd thirdparty; tar xzf desktop-0.4.2.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty desktop-0.4.2/desktop
cd thirdparty; tar xzf keyring-3.7.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty keyring-3.7/keyring
......
......@@ -7,7 +7,7 @@ Forwarded: not-needed
--- a/Makefile
+++ b/Makefile
@@ -201,7 +201,6 @@
@@ -229,7 +229,6 @@
cd thirdparty; tar xzf desktop-0.4.2.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty desktop-0.4.2/desktop
cd thirdparty; tar xzf keyring-3.7.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty keyring-3.7/keyring
cd thirdparty; tar xzf lockfile-0.12.2.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty lockfile-0.12.2/lockfile
......@@ -15,7 +15,7 @@ Forwarded: not-needed
cd thirdparty; tar xzf python-ntlm-40080cff37ab32570f9bb50bad0a46b957409c18.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty python-ntlm/ntlm
cd thirdparty; tar xzf wxScheduler-r151.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty wxScheduler/wxScheduler
cd thirdparty; tar xzf WMI-1.4.9.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty WMI-1.4.9/wmi.py
@@ -212,7 +211,6 @@
@@ -240,7 +239,6 @@
cd taskcoachlib/thirdparty; patch -p1 < ../../thirdparty/patches/customtreectrl.diff
cd taskcoachlib/thirdparty; patch -p1 < ../../thirdparty/patches/hypertreelist-headers.diff
cd taskcoachlib/thirdparty; patch -p1 < ../../thirdparty/patches/hypertreelist.diff
......@@ -247,7 +247,7 @@ Forwarded: not-needed
--- a/taskcoachlib/gui/menu.py
+++ b/taskcoachlib/gui/menu.py
@@ -19,7 +19,7 @@
@@ -20,7 +20,7 @@
from taskcoachlib import patterns, persistence, help # pylint: disable=W0622
from taskcoachlib.domain import task, base, category
from taskcoachlib.i18n import _
......@@ -357,7 +357,7 @@ Forwarded: not-needed
--- a/taskcoachlib/gui/viewer/task.py
+++ b/taskcoachlib/gui/viewer/task.py
@@ -26,7 +26,7 @@
@@ -27,7 +27,7 @@
from taskcoachlib.domain import task, date
from taskcoachlib.gui import uicommand, menu, dialog
from taskcoachlib.i18n import _
......
......@@ -10,7 +10,7 @@ Forwarded: yes
--- a/Makefile
+++ b/Makefile
@@ -244,7 +244,7 @@
@@ -272,7 +272,7 @@
cd i18n.in; $(PYTHON) make.py
i18n.in/messages.pot: $(shell find taskcoachlib -name '*.py' | grep -v i18n)
......
......@@ -9,7 +9,7 @@ Forwarded: not-needed
--- a/Makefile
+++ b/Makefile
@@ -207,8 +207,6 @@
@@ -235,8 +235,6 @@
cd thirdparty; tar xzf wxScheduler-r151.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty wxScheduler/wxScheduler
cd thirdparty; tar xzf aui-r72315.tar.gz -C ../taskcoachlib/thirdparty
cd thirdparty; tar xzf WMI-1.4.9.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty WMI-1.4.9/wmi.py
......
......@@ -24,7 +24,7 @@ Forwarded: not-needed
class SquareMap(tooltip.ToolTipMixin, squaremap.SquareMap):
--- a/Makefile
+++ b/Makefile
@@ -202,7 +202,6 @@
@@ -230,7 +230,6 @@
cd thirdparty; tar xzf keyring-3.7.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty keyring-3.7/keyring
cd thirdparty; tar xzf lockfile-0.12.2.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty lockfile-0.12.2/lockfile
cd thirdparty; tar xzf PyPubSub-3.3.0.tar.gz --strip-components=2 -C ../taskcoachlib/thirdparty PyPubSub-3.3.0/src/pubsub
......
......@@ -25,7 +25,7 @@ Forwarded: not-needed
import Carbon.Folder, Carbon.Folders, Carbon.File
--- a/Makefile
+++ b/Makefile
@@ -213,7 +213,6 @@
@@ -241,7 +241,6 @@
cd thirdparty; tar xzf agw-r70845.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty agw/customtreectrl.py
cd thirdparty; tar xzf agw-r70819.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty agw/hypertreelist.py
cd thirdparty; tar xzf gntp-d639fa2e981fe41196a5115ad64320b5061f004b.tar.gz --strip-components=1 -C ../taskcoachlib/thirdparty gntp/gntp
......
......@@ -22,8 +22,5 @@ official_chardet.diff
official_combotreebox.diff
disable_failing_test.diff
missing-import-in-openfile.diff
reproducible_build.diff
twisted-version-compare.diff
gtk3_v3.patch
......@@ -18,7 +18,7 @@ override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
rm -fr tests_tmp
# Disable unit until they migrate to python-wxgtk3.0.
# ADTTMP=. sh debian/tests/unittests
# AUTOPKGTEST_TMP=. sh debian/tests/unittests
endif
override_dh_auto_clean::
rm -rf tests_tmp
......
......@@ -5,10 +5,10 @@ set -C -e -f -u
# upstream test suite tests/test.py.
# The latter insists on writing various files, so we need to run it in
# a writable directory: ADTTMP/tests_tmp. Cleaning ADTTMP/tests_tmp is
# a writable directory: AUTOPKGTEST_TMP/tests_tmp. Cleaning it is
# the responsibility of the caller.
# When called by debian/rules, . is writable, ADTTMP=. and "tests.py"
# When called by debian/rules, . is writable, AUTOPKGTEST_TMP=. and "tests.py"
# will find the local version of taskcoachlib in ...
# When called by autopkg-test or sadt, . may not be writable and
......
version=4
opts=\
dversionmangle=s/\+dfsg$//,\
repack,\
compression=xz \
https://sf.net/taskcoach/TaskCoach@ANY_VERSION@-raw@ARCHIVE_EXT@
......@@ -21,7 +21,7 @@ import os
def visitDir(arg, dirname, names):
try:
names.remove('.svn')
names.remove('.hg')
except:
pass
......
......@@ -170,6 +170,7 @@ iconlist = [
('weather_sunny_icon', 'apps', 'kweather', [16]),
('weather_umbrella_icon', 'apps', 'colors', [16]),
('wrench_icon', 'actions', 'configure', [16, 22, 32]),
('graph_icon', 'apps', 'graph', [16, 22, 32]),
]
icons = {}
......
No preview for this file type
icons.in/taskcoach.png

6.32 KB | W: | H:

icons.in/taskcoach.png

5.25 KB | W: | H:

icons.in/taskcoach.png
icons.in/taskcoach.png
icons.in/taskcoach.png
icons.in/taskcoach.png
  • 2-up
  • Swipe
  • Onion skin
#!/usr/bin/python
'''
Task Coach - Your friendly task manager
Copyright (C) 2004-2016 Task Coach developers <developers@taskcoach.org>
Task Coach is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Task Coach is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'''
import os, shutil
def nuke():
sin, sout = os.popen4('svn st --no-ignore')
for line in sout:
if line.startswith('?') or line.startswith('I'):
filename = line[7:].strip()
if filename != '.buildbot-sourcedata':
if os.path.isdir(filename):
shutil.rmtree(filename)
else:
os.remove(filename)
print 'Removed', filename
sout.close()
sin.close()
if __name__ == '__main__':
nuke()
......@@ -193,7 +193,8 @@ if sys.argv[1] == 'py2exe':
'taskcoachlib.thirdparty.pubsub',
'taskcoachlib.thirdparty.pubsub.core',
'taskcoachlib.thirdparty.pubsub.core.kwargs',
'taskcoachlib.thirdparty._weakrefset'],
'taskcoachlib.thirdparty._weakrefset',
'igraph.vendor.texttable', 'cairo'],
'dist_dir': os.path.join(builddir, py2exeDistdir),
'dll_excludes': ['MSVCR80.dll', 'UxTheme.dll']}},
'data_files': dll_files + mo_files})
......
......@@ -20,16 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# Sanity check
import sys
PYTHONEXE = 'python'
if sys.platform == 'darwin':
import struct, os, subprocess
if len(struct.pack('L', 0)) == 8:
print 'Running 64-bits Python on Darwin; relaunching with 32-bits Python.'
sys.exit(os.system('python-32 %s' % ' '.join(sys.argv)))
output = subprocess.check_output(['getconf', 'LONG_BIT']).strip()
if output == '64':
PYTHONEXE = 'python-32'
PYTHONEXE = sys.executable
import struct
if sys.platform == 'darwin' and len(struct.pack('L', 0)) == 8:
......@@ -43,7 +34,7 @@ Release steps:
* Wait for the confirmation email from Launchpad and copy the URL
* Run 'cd i18n.in && python make.py <url>' to update the translations
* Run 'make languagetests' to test the translations
* When all tests pass, run 'svn commit -m "Updated translations"'
* When all tests pass, run 'hg commit -m "Updated translations"'
- Run 'make reallyclean' to remove old packages.
- Run 'make alltests'.
- Run 'python release.py release' to build the distributions, upload and download them
......@@ -52,7 +43,7 @@ Release steps:
Twitter, Identi.ca, Freecode and PyPI (Python Package Index), mark the bug reports
on SourceForge fixed-and-released, send the
announcement email, mark .dmg and .exe files as default downloads for their
platforms, and to tag the release in Subversion.
platforms, and to tag the release in Mercurial.
- Create branch if feature release.
- Merge recent changes to the trunk.
- Add release to Sourceforge bug tracker and support request groups.
......@@ -244,7 +235,7 @@ def rsync(settings, options, rsync_command):
def building_packages(settings, options):
host = settings.get('buildbot', 'host')
metadata = taskcoachlib.meta.data.metaDict
branch = 'branches/Release%s_Branch' % '_'.join(metadata['version'].split('.')[:2])
branch = 'Release%s_Branch' % '_'.join(metadata['version'].split('.')[:2])
if options.dry_run:
print 'Skipping force build on branch "%s"' % branch
else:
......@@ -645,7 +636,7 @@ def releasing(settings, options):
uploading_website(settings, options)
announcing(settings, options)
updating_Sourceforge_trackers(settings, options)
tagging_release_in_subversion(settings, options)
tagging_release_in_mercurial(settings, options)
marking_default_downloads(settings, options)
......@@ -735,30 +726,17 @@ Server said: %s
@progress
def tagging_release_in_subversion(settings, options):
def tagging_release_in_mercurial(settings, options):
metadata = taskcoachlib.meta.data.metaDict
version = metadata['version']
username = settings.get('sourceforge', 'username')
release_tag = 'Release' + version.replace('.', '_')
output = subprocess.check_output(['svn', 'info'])
for line in output.split('\n'):
if line.startswith('URL: '):
source_url = line[5:].strip()
break
else:
raise RuntimeError('Could not find source URL')
if source_url.startswith('https://'):
tag_url = 'https://svn.code.sf.net/p/taskcoach/code/tags/'
else:
tag_url = 'svn+ssh://%s@svn.code.sf.net/p/taskcoach/code/tags/' % username
target_url = tag_url + release_tag
hg_tag = 'hg tag %s' % release_tag
commit_message = 'Tag for release %s.' % version
svn_copy = 'svn copy -m "%s" %s %s' % (commit_message, source_url, target_url)
if options.dry_run:
print 'Skipping %s.' % svn_copy
print 'Skipping %s.' % hg_tag
else:
os.system(svn_copy)
os.system(hg_tag)
os.system('hg commit -m "%s"' % commit_message)
COMMANDS = dict(release=releasing,
......@@ -777,7 +755,7 @@ COMMANDS = dict(release=releasing,
mail=mailing_announcement,
announce=announcing,
update=updating_Sourceforge_trackers,
tag=tagging_release_in_subversion,
tag=tagging_release_in_mercurial,
markdefault=marking_default_downloads,
markfixed=marking_bug_fixed,
markreleased=marking_bug_released)
......
......@@ -80,9 +80,8 @@ if system == 'Linux':
current_dist = [dist.lower() for dist in platform.dist()]
if 'debian' in current_dist or 'ubuntu' in current_dist:
setupOptions['data_files'] = [('share/applications', ['build.in/linux_common/taskcoach.desktop']),
('share/appdata', ['build.in/debian/taskcoach.appdata.xml']),
('share/pixmaps', ['icons.in/taskcoach.png'])]
if 'ubuntu' in current_dist:
setupOptions['data_files'].append(('share/appdata', ['build.in/debian/taskcoach.appdata.xml']))
elif system == 'Windows':
setupOptions['scripts'].append('taskcoach.pyw')
major, minor = majorAndMinorPythonVersion()
......@@ -118,7 +117,7 @@ elif system == 'Darwin':
import struct
wordSize = '32' if struct.calcsize('L') == 4 else '64'
sys.path.insert(0, os.path.join('taskcoachlib', 'bin.in', 'macos', 'IA%s' % wordSize))
sys.path.insert(0, os.path.join('extension', 'macos', 'bin-ia32'))
sys.path.insert(0, os.path.join('extension', 'macos', 'bin-ia%s' % wordSize))
# pylint: disable=F0401,W0611
import _powermgt
import _idle
......
......@@ -48,6 +48,7 @@ defaults = {
'calendarviewercount': '0',
'hierarchicalcalendarviewercount': '0',
'taskstatsviewercount': '0',
'taskinterdepsviewercount': '0', # Number of interdep viewers in main window
# Language and locale, maybe set externally (e.g. by PortableApps):
'language': '',
# Language and locale as set by user via preferences, overrides language:
......@@ -118,6 +119,22 @@ defaults = {
'hidecompositetasks': 'False',
'piechartangle': '30',
},
'taskinterdepsviewer': {
'title': '',
'toolbarperspective': 'Separator,Spacer,ViewerHideTasks_completed,ViewerHideTasks_inactive,ResetFilter,Search',
'searchfilterstring': '',
'searchfiltermatchcase': 'False',
'searchfilterincludesubitems': 'False',
'searchdescription': 'False',
'regularexpression': 'False',
'hideinactivetasks': 'False',
'hidelatetasks': 'False',
'hideactivetasks': 'False',
'hideduesoontasks': 'False',
'hideoverduetasks': 'False',
'hidecompletedtasks': 'False',
'hidecompositetasks': 'False',
},
'prerequisiteviewerintaskeditor': {
'title': '', # User supplied viewer title
'toolbarperspective': 'TaskNew,NewSubItem,TaskNewFromTemplateButton,Separator,Edit,Delete,Separator,TaskMarkInactive,TaskMarkActive,TaskMarkCompleted,Separator,EffortStart,EffortStop,Spacer,ViewerHideTasks_completed,ViewerHideTasks_inactive,ResetFilter,Search',
......@@ -352,6 +369,7 @@ defaults = {
'regularexpression': 'False',
'round': '0', # round effort to this number of seconds, 0 = no rounding
'alwaysroundup': 'False',
'consolidateeffortspertask': 'False',
},
'effortviewerforselectedtasks': {
'title': '',
......@@ -372,6 +390,7 @@ defaults = {
'regularexpression': 'False',
'round': '0', # round effort to this number of seconds, 0 = no rounding
'alwaysroundup': 'False',
'consolidateeffortspertask': 'False',
},
'effortviewerintaskeditor': {
'toolbarperspective': 'EffortNew,Separator,Edit,Delete,Separator,EffortStartForEffort,EffortStop,Separator,EffortViewerAggregationChoice,Spacer,ResetFilter,Search',
......@@ -391,6 +410,7 @@ defaults = {
'regularexpression': 'False',
'round': '0', # round effort to this number of seconds, 0 = no rounding
'alwaysroundup': 'False',
'consolidateeffortspertask': 'False',
},
'attachmentviewer': {
'title': '',
......
......@@ -28,12 +28,16 @@ class ScheduledMethod(object):
def __init__(self, method):
self.__func = method.im_func
self.__self = weakref.ref(method.im_self)
self.__id = None
def setId(self, id_):
self.__id = id_
def __eq__(self, other):
return self.__func is other.__func and self.__self() is other.__self()
return self.__func is other.__func and self.__self() is other.__self() and self.__id == other.__id
def __hash__(self):
return hash(self.__dict__['_ScheduledMethod__func'])
return hash((self.__dict__['_ScheduledMethod__func'], self.__id))
def __call__(self, *args, **kwargs):
obj = self.__self()
......
......@@ -57,17 +57,28 @@ class BaseCompositeEffort(base.BaseEffort): # pylint: disable=W0223
return duration.round(seconds=rounding, alwaysUp=roundUp)
return duration
def duration(self, recursive=False, rounding=0, roundUp=False):