Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
2630 lines (2276 sloc) 139 KB
= Done
+ As @developer I want a distillery for "low-ceremony" development of the new, java bootsrapper based iwant, without breaking the current implementation
+ As @developer I want a simple "driver script" ( that runs whatever techical definitions of done (compilation, test, descript) I currently have so I just need to give one command after changes to get a "license to commit"
+ As @developer I want to compile and test the java entry point
* just use junit jar assumedly downloaded by the current as-iwant-developer iwant
+ As @developer I want a descript with versioned output for easy and pragmatic TDD: no need to edit expectations, just verify output diffs by eye before commits
* cmd echo hello, version output
+ As @buildscriptauthor I want to svn export the cli so I can start using a known version of iwant on my project
* descript-driven
+ As @buildscriptauthor I want to run so it can start guiding the building of my workspace
* descript-driven
+ As @developer I want to unit test so I can trust it before proceeding in the build
+ create mock java entry that prints cwd and cmdline args
+ assert stdout, stderr and cwd
+ As @developer I @anticipate it's best if does NOT cd but passes AS_SOMEONE as the 1st cmdline arg so that the java entry is more robust and useful in envs that make it more cumbersome to control cwd (like eclipse)
+ As @buildscriptauthor I want 1st run of to print "I created iwant-from for you" and create it so I have a starting-point for my edits
+ descript output
+ junit output
+ descript the created file
+ junit it
+ As @developer I want test-area as a reusable module so I can test file operations
+ As @developer I want Iwant main to fail if as-someone arg or dir missing so I get friendly message if I break its caller
+ As @buildscriptauthor I want iwant bootstrapper ( to generate an example wsdef using a local url to iwant so I can start developing
* this is one huge epic, because earlier I made the mistake of trying to handle it as one story in the backlog of the _previous_ iwant version.
+ iwant-from points to local iwant wsroot, run
+ descript a bit
+ edit iwant-from
+ junit
+ mocked url provider for svnkit jar
+ mocked cache location for unmodifiable
+ real values for locations
+ get svnkit jar from downloader method
+ robust cache path for url
+ entry asks cache location from the mockable network interface
so the download test can control the cache
+ test download of correct content when cached missing
+ test does not download when cached exists
+ unzip method
+ test with hard-coded small zipfile
+ svnkit download method
+ test with mocked url and cache
+ assert result is an unzipped dir that contains the unzipped url
+ svn export of iwant
+ export when cached iwant missing
+ utilize the tested download method to get svnkit for the test
+ in suite, test all needed functionality before this test:
+ download
+ real cache location
+ real svnkit location
+ test class, setUp ensures cached unzipped svnkit
+ versioned mock iwant rootdir
+ assert export method exports to given dir
+ pass url to cache location method so the mock can
mock all but the svnkit zip cache
+ fix: find wsroot even when running
+ don't generate entry2 mock now that we have one versioned
+ fix: unzip works with test files but not with svnkit zip
* currently tests pass only if fixing the real cache by hand
+ test if it is because of jars inside zip
+ test if it is because parent dirs come after their content in the stream
+ fixed: it was just awfully slow because of no buffering: I had just stopped a test so I got a partially unzipped svnkit there, doh!
+ junit: bootstrap when only iwant-from is given
* removed the test for already downloaded iwant
+ point svnkit url to really downloaded file
+ assert hello from entry 2 using the mocked wsroot
+ assert hello from mocked entry 1, referenced by entry 2 to prove the common functionality from there can also be evolved without breaking runtime
+ delegate to entry2
+ write mock impl of entry2
+ test correct args get passed
+ impl: compile and run
+ descript bootstrap call: call to show real iwant2 output
+ implement failing iwant2
+ iwant2
* now just KISS: don't use iwant (workspace, targets), just raw
download+compilation using entry 1. Later we can eat the dogfood,
when we have it
+ no i-have/ws-info => fail with message, example created
* ha, TDD again drives design: I don't want to call Iwant2.main!
+ instead: Iwant2.using(nw) just like Iwant
* Iwant still calls Iwant2 by main, because it will always
use the real locations and because they have different classloaders
so there isn't even an easy way to pass other than standard classes
+ test & impl
+ descript
+ make entry2 main call evaluate with real locations
+ catch IwantException (a non-bug one), print message and exit 1
+ don't prevent system exit in entry1 when calling entry2
+ cat the example ws-info
+ delegate to actual (distilling) iwant
+ Iwant3 and its test to do what Iwant2 does now
+ Iwant2's new role
+ compile iwant (distillery2) main
+ run main suite
+ compile tests, too
+ download junit.jar
+ mock-wsroot to test both test failure and success
+ 3rd delegation: iwant2 -> iwant3
+ only if test passes
+ debug log disabled
+ run junit silently and only print after failure
(failure tested only manually with temporarily broken test)
+ iwant3
+ invalid wsinfo => failure
+ valid wsinfo => create example wsdef java
+ descript: rerun with example ws-info => fail with message, example wsdef java created
+ forge junit times in the descript to prevent unnecessary diffs
+ create wish scripts, not only example wsdef
+ wish scripts call with own relpath as arg
+ descript: iwant3 prints hardcoded output for list-of/targets and hello
+ functional example wsdef
+ copy example java from actual source directory
+ use WsRootFinder to find it
+ iwant3 compiles wsdef
+ iwant3 delegates to wsdef
+ list-of/targets comes from wsdef
+ target/x/as-path comes from wsdef
+ cast to interface instead of calling by reflection
+ 2 class instances in use, find out why
* don't classload the api again
+ fix
+ descript: rerun with example wsdef => "try .../list-of/targets"
+ inherit base in example wsdef and tdd example behaviour
+ descript: modify wsdef and rerun
+ unit test: list-of/targets and target/x/as-path with dumb behaviour, to get going with tdd for it
+ compile iwant to separate dir, not a subdir of exported wsroot
* it was already like this, the dir was a leftover of some work in progress testrun
+ svn export laziness/eagerness
+ no export when cached iwant exists
+ except when remote is a file: changes in entry2 are effective immediately when developing, if local dir is deleted and re-exported
+ slighty nicer stderr: ":task -> destfile" and "(task debug message)*"
+ laziness of svn export: done at some point
+ list-of/targets creates wish scripts
+ descript: new target as path after "creating" it in the wsdef
+ refactor: WishEvaluator contains refresh logic, not wsdef base class
+ target produces content as stream (HelloTarget)
+ refactor: StreamUtil for prod and test
+ iwant2 tests the whole suite, not only Iwant3Test
+ descript & tdd: HelloTarget.refreshTo, so now either stream or file content
+ get content of target that uses another target's stream
* green withouth changes!
+ get content of target that uses another target's file
* reintroducing the concept of ingredients
+ paths to the 2 previous targets
+ target that uses source stream as ingredient
+ target that uses source file as ingredient
+ JavaClasses
+ optimization for descript: don't re-export file url if iwant-from contains re-export=false
+ fix descript: first normal iwant-from to make sure we use newest iwant, then edit to keep on using that version without re-export
+ refactor: refresh ctx mock needs a lot of teaching in target tests
* SepOfConc: target says where it's cached and, in another method, how
(+ laziness: source is never cached)
+ refactor: interface Target->Path, Path is a superclass for targets, provides name
+ refactor: target superclass provides cache location
+ As @buildscriptauthor I want to make iwant generate eclipse settings so it will be easier for me to modify workspacedef
* new concept: side-effect
+ descript: before editing wsdef issue iwant/side-effect/eclipse-settings/effective
+ generate the wish script (and list-of)
+ descript: ls .../wsdef/...{.project,.classpath}
* here we keep things hard-coded as much as possible: genuine support for
side-effects will be added later
+ new module (only package for now) for eclipse settings content generation
+ iwant uses the generator to create the wsdef files
* very hard-coded content
+ manually trying the settings in a proto project
+ fix classpath so wsdef compiles in eclipse
+ As @buildscriptuser I want iwant to refresh targets lazily i.e. iff for target or any of its ingredients cached is missing or descriptor has changed
+ as path twice => second causes no refresh
+ descriptor changes, no other changes => refresh
+ ingredient changed => refresh
+ test that the simple impl is broken
+ develop a separate module for lazy task execution (multi-threaded even)
* sorry, this happened in isolation, no log for it
+ add to iwant (name here is "planner")
+ integrate
+ As @developer I want slashes in cached paths and some more exceptions to url encoding so the paths will be shorter and less files per directory
* this introduces a risk, but since build tools are anyway capable of doing great harm, the only real risk is that of accidents and bugs, so let's proceed
+ allow slashes, just prevent parent dir refs (..), preserve repeated slashes etc
+ As @buildscriptauthor I want my wsdef to be 2-phased i.e. I can define the compilation of wsdef in "wsdefdef" so I can define custom and 3rd party code in my build
* for now the names are wsdefdef=IwantWorkspaceProvider and wsdef=IwantWorkspace. These names suck, see later story
+ make Iwant3 load wsdefdef instead of wsdef
+ write/modify tests to test Iwant3 compiles & classloads wsdef defined in wsdefdef
+ update example generator to generate both wsdefdef and wsdef
(* update descript: no need, it was good)
+ fix i-have/wsinfo example
+ update hard-coded eclipse-settings generator
+ KISS: for now: just one eclipse project for the whole workspace!
+ manually test with a dummy ws using iwant
+ update descript to ls eclipse files from the ws root
+ As @buildscriptauthor I want to define a file downloaded from a url
+ descript in wsdefdef, because this is most probably the first place it's needed in, to make it possible to use ext code in wsdef
+ ingredients and descriptor basics
+ delegates to Iwant.downloaded
+ manually test with emptied cache and working net connection
+ descript using of downloaded code
+ @bugfix: as @buildscriptuser I want a target refreshed when a source has been modified
+ make TargetRefreshTask.isDirty compare src recursively to timestamp of contentdescr
+ As @buildscriptuser I want lazy compilation and testing during bootstrap so I don't have to wait for them when I haven't changed iwant-from
+ simple timestamp and source descriptor logic
+ remove some redundancy in text file reads
+ cleanup (more needed later)
+ As @buildscriptauthor I want eclipse settings to contain classpath additions of wsdef classes so Eclipse can also compile wsdef
+ new concept: SideEffect
+ list-of/side-effects consults wsdef
+ side-effect/x/effective delegates to the s.e.
* and EclipseSettings does the thing
+ unit test for EclipseSettings
+ move WsInfo to api, it's needed by eclipse settings s.e.
+ actually: extract interface: only parsing is part of impl and if belongs to api
+ EclipseSettings takes wsdef as JavaClasses from context
+ EclipseSettings puts wsdef src to .classpath
+ JavaClasses accepts srcdir instead of package dir
+ EclipseSettings puts wsdef deps to .classpath
+ manually test with a dummy project
+ fix: iwant classes only once, as normal dep
+ @refactor: As @developer I want cleaner and centralized cache location logic and also all ws caches under same dir so that...
* there is only one place to ask cache location for path (the ctx)
* paths cannot access non-cache related stuff when telling their cache location
* one cache dir => easier to wipe
+ do refactoring
+ manually test and also see there is only 1 cache
+ fix to use same cache
+ @bugfix: as @buildscriptuser I want a target refreshed when a source has been DELETED
+ test it's broken, using WishEvaluator test because it tests laziness
+ ha, it works on linux, because parent dir gets modified, so split the story
+ As @buildscriptauthor I want to declare a target to use the singleton resource "computer" so it runs alone even when it's the only one explicitly using the resource
* so e.g. a performance test can be run reliably with minimal effort
+ make worker count 2 by default so we have some parallelization always
* actually it's not a resource but a boolean "supportsParallelism"
+ first do in planner module in isolation
+ then adapt to a Target
+ As a @buildscriptuser I want to define the number of threads to use so I get performance from my machine
* also as descript generator I want reliable output
(- TODO on commandline, in a conf file, something else or all of them?)
(- TODO automatic detection of cpu count and using it for a good default?)
+ parse user-preferences and output it in when all setup, mentioning that
defaults are used because file is missing
+ test same output with existing file
+ properties impl for user prefs
+ descript: write workercount=1 to the file and rerun
+ log target refresh with worker number for "manual reassurance"
+ As @buildscriptauthor I want to use ant for a target so that I can utilize its wide support of tools
* the idea is to just evaluate default target, all dependency handling etc belongs to iwant
+ adapt Concatenated from main branch for robust script generation
+ download ant.jar and ant-launcher.jar for test
+ AntGenerated: target using downloaded ant.jar and minimal scripts
+ minimal outputting echo and fail scripts
+ assert exit status and stderr content
+ hello world file generating ant script that references dependencies, by path and content
+ descript
+ to avoid misunderstanding: 1st replace ant.jar with commons-math
+ FromRepository: easily reusable way of referring to the ant jars used in AntGeneratedTest
+ then demonstrate file-generating hello ant
+ script refers to hello2 so extract method in all versions of the wsdef
+ As @buildscriptauthor I want an easy way to refer to a certain version of ant.jar from ibiblio so I can easily pick public dependencies
* was implemented in the AntGenerated story as FromRepository
+ @bugfix As @buildscriptuser I want iwant to generate wish scripts even when I only have the wish available, after having checked out the ws
* Iwant3 doesn't refresh wish scripts, if is called when wsdef java already exists
* this is the case after checking out a workspace
+ As @javaprogrammer I want to just put iwant in my classpath and use it with minimal code from my java code without setting up the full directory structure and bootstrapping so I can utilize its features in my program
* useful in iwant's own tests
+ AsEmbeddedIwantUser
+ use in AntGeneratedTest
+ remove some unneeded deps from WishEvaluator
+ bugfix: make workerCount=1 by default, after all, descript used worker 1 instead of 0 before changing it
+ As @buildscriptauthor I want to declare separate eclipse settings for each module instead of the default one per workspace so that Eclipse will force correct dependencies for java developers
( * one module for as-x-developer, hosting wsdefdef, another for x-workspace
* move wsdef in example generator, tests and manual dummy project
from as-x-developer/i-have/wsdef to x-workspace/src/main/java
* no, better to keep all under as-x-developer/i-have so no wizard generation
outside of it, risking name collisions with existings files
+ move ws-info etc to subdir "conf" so we can have 3 eclipse projects
+ replace wsdef(def)? with wsdef(def)?/src/main/java to avoid
having to use project root as src for eclipse
+ change eclipse settings to generate
* as-x-developer/i-have/conf
* as-x-developer/i-have/wsdef
* as-x-developer/i-have/wsdefdef
+ back and forth: after all put just ../wsdefdef in ws-info, and name
+ (for now) make the src dir "src/main/java" inside it hardcoded
+ and now is a good time to rename WSDEF_CLASS to WSDEFDEF...
+ publish wsdefdef and wsdef as JavaModule in ctx for s.e. definition
+ JavaModule
+ File rootDir()
+ JavaClasses mainJavaClasses()
+ (utilize or) delete the now unused but tested WsDefEclipseProject class
+ descript change
+ manual test
+ better error messages for missing/nondir srcdir of JavaClasses
(if wsname does not match as-someone dir name iwant cannot find wsdef)
+ @bugfix: same target depended many times => iwant tries to refresh many times at the same time (workerCount>1), causing race conditions
+ equals/hashCode of TargetRefreshTask must compare name, otherwise TaskQueue set of tasks being refreshed etc don't work
+ @bugfix generates compiled-by-Iwant under classes directory. Don't.
+ @bugfix produce empty classes when java src directory contains no java files, don't fail
+ test and fix empty and non-empty dir with no java files
+ @bugfix: add ingredients of the path of JavaModule.implicitLibrary as implicit library dependencies so deps work correctly even with generated libraries
+ @bugfix: make JavaModule.mainClasses (of normal "explicit" module) return null if no mainJava, also don't add such paths as dependencies
+ @enhancement: automatically delete cached file before refresh, for convenience of the Target author
+ make TargetRefreshTask do it
+ don't do it for Downloaded, because when the content descriptor is missing, the target is dirty
but it's ok when we don't delete the cached download, the actual refresh then does nothing
+ boolean Target.expectsCachedTargetMissingBeforeRefresh() that can be overridden for other similar Targets
+ also test parent of cached target is created (it already was)
+ @bugfix: make bootstrapping ( pass as different user than wipu to find hardcoded paths from tests etc
+ run as different user
+ make download junit.jar
+ don't write filelog to one location (/tmp/iwant-cl) but instead under ~/.net.sf.iwant/log (not allowed when it exists for another user)
+ test again, what tests contain hard-coded paths?
+ fix AntGeneratedTest /home/wipu
+ @enhancement: add cygwin support to shell cli
+ must use cygpath in cygwin for paths used by javac and java
+ test cache path escaping handles windows paths (backslash, colon and space)
+ test manually in a wintoys machine
+ make IwantTestRunner use unix file.separator so tests don't need changes
+ ah, doesn't help, so skip tests altogether if file.separator is backslash!!
+ make FileUtil.relativePathOfFileUnderParent work without regexps, because wintoys backslashes
break them
+ pass IWANT_PROXY_{HOST,PORT} to java as sysprops in
+ manually test how difficult windows file.separator makes life with cygwin
* seems to work, of course the output path is in wintoys format, making it more difficult to use in scripts
but it's not important
+ @bugfix: delete wish scripts before writing fresh ones to remove unusable clutter
* Now also list of side-effects is no more hard-coded
+ @bugfix: only redirect stderr once so threads don't race for output
+ quick and dirty: do in Iwant.runJavaMain like before, but keep a counter and only do it once and restore originals when all ready
+ change: redirect out to err instead of buffering and only showing after failure
+ but show output of self-test only after failure
+ manually test with real project
+ As @buildscriptuser I want number of concurrent workers logged as well as the Target type of each refreshed target
* so I can detect bottlenecks for parallelism and know what code is refreshing what
+ just tdd the string building, not actual logging
+ test with descript the actual log output
+ test manually the actual log output
+ @enhancement: testClasses support for JavaModule
+ build target for it like doing for mainClasses
+ make it null for lib module
+ make testDeps empty, not null, for lib module
+ @enhancement: testClasses implicitly uses mainDeps
+ add them
+ add only once even if redundantly declared as test dep
+ @enhancement: module's own main classes are a test dep
+ @bugfix: don't add null to test deps if module has no main classes
+ As a @buildscriptauthor I want Iwant to fail if my Target impl accesses a cached path during refresh without having declared it as ingredient
* so that I don't get incorrect results by using invalid cached content
+ test referring to same path from a correct target, to make sure it really
checks the ingredients of the referring target
+ TargetRefreshTask wraps ctx with a checking impl
+ allow referring to target itself, and even a path with same name
+ @bugfix: ingredient of ingredient must be ok to refer to during refresh, otherwise a target would have to declare a lot of its indirect ingredients
+ @bugfix: even ingredients (of ingredients) need to be compared by name, not equality, because not all Path implementations implement equals/hashCode
+ @enhancement: friendly exception for null ingredient
+ As a @buildscriptuser I want the log to mention why each target is refreshed so I can understand the logic better
* S~ for source modification etc
+ replace boolean with enum for dirty check
+ print it
+ @optimization: only check each target dirtyness once during a build
+ map dirtinesses in TaskQueue
+ remove the unnecessary caching inside TargetRefreshTask
+ @bugfix and @optimization: make target refreshes really parallel
* tested at planner level with TaskMock, but not working in practice
+ test end-to-end (in WishEvaluatorTest) with a controllable mock target that utilizes the controllable TaskMock
+ remove unnecessary synchronization from TargetRefreshTask that blocks other threads that try to read the task during its refresh
+ @enhancement: Iwant uses -Xlint for javac to see verbose warnings (but not the extremely controversial serialversionuid warning!)
+ As @developer I want an ant cli for iwant that can be used by eclipse project builders so I can more easily create eclipse projects for modules that generate code
* also: as ant user I want to use iwant so I don't have to install cygwin
+ just hack an ant script that compiles iwant entry and passes the wish to it, testing manually in a dummy project
+ test happy case by demonstrating in descript
+ help case: no wish
+ wish cases:
+ list-of/targets
+ target/.../as-path
+ @enhancement: As http proxy user I want iwant to use the Unix-style http_proxy and http_proxy instead of the custom value so I don't need to configure it twice
* also: do it in java so it also works from the ant interface
+ tdd env values -> sysprop setting
+ remove setting of the custom variables from
+ manually test it works in a proxy environment
+ fix: http_proxy is an url, not only host[:port]
+ enable proxy also before calling svnkit
+ works
+ As @buildscriptauthor I want to generate content with an external script so I can utilize the unix tools
+ adapt tests and impl from the main branch for ScriptGenerated
+ fresh temporary directory
+ copy script there and chmod
+ run
+ verify cwd, out, err, creation of destfile, exit status
+ parallel test to see tempdirs are not shared by 2 threads
+ also test that tests it's the Thread name in the dir name
+ descript
+ As @buildscriptuser I want iwant to verify the checksum of the downloaded files so I don't get any corrupted stuff
+ MD5 basic functionality
+ make checksum optional for Downloaded
+ find out why the test is slow to init
* whoa, URL.hashCode tries DNS resolve!
+ fix in many places to use localhost urls
+ cleanup file/stream handling (closing)
+ reuse
+ reuse everywhere
+ @enhancement As Win64 user I want a 64-bit eclipse installed by so I don't have to resolve 32/64 complications
+ also here make unzip quiet
+ @enhancement More sane settings for newly installed eclipse
+ launch previously run, not the open one
+ make constants italic, like other static members
+ more warnings
+ @enhancement generated eclipse: new method body template to throw USE
+ @enhancement: usable eclipse settings generation
+ code generator support in .classpath and .project
+ replace old mechanism with new
+ test in real dummy project
+ as @buildscriptauthor I want a simple pair of targets, instrumentation and forked testrun, so I can easily measure test coverage of a java-classes path
+ instrumentation using emma that contains the emma metafile, confs, instrumented classes
+ mention in ec filename in conf that it should be overridden during testrun
* this way the coverage report will be about a testrun, and one module can be involved in many
+ testrun using given ant that produces the required ec file
+ buildscript that forks a new jvm so the ec will get created
+ remove redundancy of ant jar download in test
+ basics of EmmaCoverage (ingredients etc)
+ real test with dummy workspace
+ add junit to tested deps, reusing the url with
+ control over classname to run during testrun
+ also arguments so junit main can be used
+ non-instrumented deps for testrun (junit.jar in dummy ws)
+ testArtifact for JavaSrcModule
+ in dummy run junit with test class as argument
+ As @buildscriptauthor I want an emma coverage report from a given set of coverage files so I can report a set of different ways to calculate coverage
+ tdd impl
+ manual test with dummy ws
+ as @developer I want new eclipse-settings-generating version of iwant for itself so I can start developing ant-depending modules
* e.g. for new jvm, tar etc
+ upgrade iwant for iwant
+ generate eclipse settings
+ some of them
- add support for many mainJava directories, needed by iwant-distillery
+ JavaClasses builder instead of direct constructor call
+ many srcs
+ affects compilation
+ way to empty the srcDirs in builder (to override convenience "builder builder" output)
+ SrcModule utilizes mainJava
+ SrcModule utilizes testJava
+ also emptyable SrcModule mainJava
+ also emptyable SrcModule testJava
+ add rest
+ distillery
+ fix distillery: depend on classpath-marker as bin module
+ example-wsdef
+ mock-wsroot
+ testarea
+ tutorial-wsdefs
+ when ready, svn:ignore eclipse settings (or postpone as later story)
+ delete
+ delete unnecessary old iwant-bootstrapper
+ ignore
+ Iwant3 no more deletes all but (including .svn !!) under with/bash/iwant/, instead it only deletes target and side-effect
* so svn won't complain after using iwant bootstrapper that has been svn:externalized
+ As @buildscriptauthor and @developer I want to easily define emma coverage report for the whole workspace of java modules so I know my test coverage
+ experiment with one project in iwant itself: testrunner with its one test class
+ another project, if needed, and then move the logic to JavaSrcModule
+ distillery2
+ add it
+ support for >1 source for JavaClassesAndSources (distillery uses that)
+ emma doesn't include interfaces in instrumented classes => add original to classpath during EmmaCoverage
+ upgrade iwant for iwant to test in practice
+ add testarea dirs to classpath for coverage
+ add other projects, referring to their Suite
+ try distillery, not passing so:
+ move test zips to test resources
+ disable concurrency for EmmaCoverage to see if it fixes the occasional deadlocks
+ make sure test resources in classpath during tests
+ ensure correct classpath so classes are found from mock-wsroot
* yes, it passes, and total line coverage is now 93%
+ svn:ignore generated testrunner in mock-wsroot (if possible, should be)
* it's just generated by a test to control whether the runner fails or not
+ As @buildscriptauthor I want a quick&dirty way of overriding 2 specific eclipse formatter settings so I can take iwant-generated settings into use in my existing project
+ just do it
* other settings will be iterated later, now these 2 just in a simple way
+ @enhancement: use JavaSrcModule as type for wsdefdef and wsdef
+ @bugfix: corret parent dir for EclipseAntScript, currently it's always ${basedir}
+ @enhancement: As @buildscriptauthor I want to declare explicit sources to follow when my code-generating module generates the sources by running a java program so that the eclipse project refreshes automatically
+ @enhancement: As @buildscriptauthor I want to use an optional filter file for emma instrumentation so my coverage won't be too low because of some code that is not really production code under my control
+ As @buildscriptauthor I want to measure coverage by running junit on a list of dynamically found test classes so I don't have to use a suite
+ test passing argument list as a Path to a file that lists the arguments as lines
+ create and use ClassNameList as the argument path
* hardcoded ClassNameList to pass this test
+ implement ClassNameList that
+ reads the names from a given classes directory
+ excludes non classes automatically
+ filters names using given StringFilter
+ @bugfix: EmmaReport must not try to refer to missing em files that are caused by a filter filtering out a whole module
+ test that EmmaInstrumentation really works like this, producing missing em file and empty instrumented classes
+ test and fix EmmaReport to skip such a module
+ @enhancement: As @buildscriptauthor I want EmmaCoverage to use jvmargs I pass to it so I can increase permgenspace etc for big test runs
+ @enhancement: Add permgen and heap in, might be that EmmaCoverage is not the issue
+ do it
+ test in the real project that currently fails
+ @enhancement: As @buildscriptuser I want EmmaInstrumentation to copy excluded files (interfaces and those defined by the filter) so I need to add a module only once in the classpath and I'm guaranteed to use instrumented classes always
* for example when deploying to a web application, you have no control over the order of jars in the classpath, meaning that noninstrumented classes may be used instead of instrumented ones
+ recursively copy files that exist in classes but not in instr-classes
+ As @buildscriptauthor I want iwant to contain enough debug and source information so I get proper variable names in my iwant-related code
* debug flag of compilation of Iwant2 untested as such, but:
+ JavaClasses supports and obeys debug flag
+ test that Iwant2 compiles the rest with debug
- add iwant sources reference to eclipse .classpath
+ try if eclipse finds sources if src is the exported iwant ws: no, it
needs one proper source directory (or zip but not practical here)
+ Iwant3 asks list of src dirs from Iwant2 and merges to 1 dir
+ Iwant2 finds java files to compile recursively
+ clean up now unnecessary compiler-fodder from mock-wsroot
+ Iwant2 uses and provides list of srcdirs
+ Iwant3 adds src to iwant classes bin module
+ derive cache location from wsroot location
+ put location in eclipse .classpath
+ Iwant2 passes iwantWs to Iwant3
+ actually combine the sources
+ reuse recursive copy code with EmmaInstrumentation
+ manually test in dummy project that iwant is now more usable
* required restart of eclipse (?!)
* not refreshed when iwant-from a file that gets re-exported, filed
as a separate bug
+ As @buildscriptauthor I want iwant api modules from side effect definition context so I can define iwant wsdef module eclipse settings for a subproject (iwant-using project integrated to another project)
+ @enhancement: As @buildscriptauthor I want EmmaCoverage to put classpath items, be them instrumented or not, to classpath in the order I specify them so I can control for example which take effect etc
+ do it
+ test in real project that it helps
+ As @buildscriptauthor I want module to tell JavaClasses to copy resources, if any, and JavaClasses to obey, so I always get resources in classpath without extra effort
* this is how other build systems do it, instead of adding resources as such in classpath.
So let's do the same, for least surprise
+ pass resources to JavaClasses
+ test JavaClasses copies files from all given resource dirs
+ allow JavaClasses with no src, just resources
+ make JavaSrcModule also support >1 resource dirs
+ make eclipse settings support >1 resource dirs
* didn't even require further tests: compiler required a for loop
+ As @buildscriptauthor I want iwant to fail if I create different versions of Paths with same name so dependency tracking works correctly etc
+ compare class
+ compare content descriptor
+ compare ingredients (bug in actual target code, descriptor should
catch this too)
+ various null checks
+ @bugfix: compare ingredients properly for conflicts, forgot to test the negative case with ingredients
+ As @buildscriptauthor I want an easy way of creating emma targets (instr and coverage) from modules, without having to build their dependencies manually
* a "from" factory method in both?
+ factory for instr: non-null only if a src module with main javas
+ factory for coverage
+ simple
(- don't put duplicates, even if same mod belongs to
cumulative test and main deps: postponed as another story)
+ upgrade iwant for iwant and try it out
+ upgrade
+ one module: works, descriptors more or less equivalent
+ the rest, clean up and evaluate usability
+ add test resources in classpath
* see another story about JavaClasses and JavaSrcModule
+ upgrade iwant for iwant
+ simplify all coverage methods of iwant build
+ more for-looping instead of explicit per-module building
+ filter out mock wsroot: duplicate classes confuse emma
+ investigate adding filter to instr
+ try
+ fix bug: directly created instrs use filter, but those created
by coverage don't
* so filter was not refreshed because dep was asked from the
filterless version of instr
+ see another story: make Iwant fail if conflicting paths
+ upgrade iwant
+ try filter again to make sure iwant now
detects the conflict: yes it does
+ fix the design so no duplicate creation of instrs, or at least
created similar
(- maybe pass an immutable builder to emma coverage)
+ or maybe emmacoverage responsibility is too big here:
+ another class should create instrs and coverages from modules
(- upgrade iwant and enable filter in iwant build:
postponed as another story)
+ evaluate and explain: to create emma targets from modules or vice versa?
* neither: again, when in doubt which of 2 things should assume new responsibility,
a third thing is needed
+ As a @buildscriptauthor I want to exclude a module from emma-report so that duplicate classes in it won't confuse emma
* example: iwant-mock-wsroot that is used by classloader magic to use mocked versions of classes
+ As @developer I want emma filter enabled so I get rid of false reds of examples
+ make it possible to exclude iwant-mock-wsroot first (another story)
+ upgrade iwant
+ use EmmaTargetsOfJavaModules
+ exclude mock wsroot
+ doh, fix: ant jars cannot be put to SortedSet
+ doh2: instrs and coverages neither, when building report
+ reupgrade
+ enable filter
+ @refactoring: As @developer I want iwant modules split so I can start increasing code reuse and also to get rid of the "distillery" naming
+ new empty module: iwant-api-model
+ move a minimal amount of model to new module
+ move ?
* the api has a lot of cross-deps, contains actual code also =>
+ add test java to api model
+ then move some
+ move more
+ fix compilation by Iwant2
+ fix compilation by Iwant3: now >1 classes in eclipse
+ add to coverage
+ module: iwant-api-javamodules
+ create empty
+ move minimal set of classes and tests
+ JavaModule ,src and bin impls, JavaSrcModuleTest
+ for now: Concatenated and HelloTarget to api-model, needed in test
+ fix compilation
+ fix coverage
+ fix descript (real bootstrapping by Iwant2)
+ bugfix: pass iwant classes only once: there are many modules only
when running tests in eclipse
* this breaks real eclipse settings
+ clean up Iwant3 code that finds and creates iwant modules
* just use SortedSet, not worth trying to test
+ before adding modules make it easy by implementing story about
emma target building from modules and take into use
+ modularization
+ abstract away dep to Iwant from api-model
+ ok, things have now started, and it's easy to create new modules so
the rest can happen step by step from here: separate stories
(- As @buildscriptauthor I want a findbugs report of my code so I can fix bugs and as @developer I want this implemented as separated module that directly depends on findbugs instead of running by reflection so I can practice implementing the story about optional modules with ext deps
+ add the module and its dependency to downloaded findbugs
+ split api mocks to separate module so testing of the target is possible
+ also required: split coreutils, stuff needed by the mocks, and others
+ tdd
+ minimal run with default settings
* problem: requires findbugs.home (what for?!) so not good fit
for direct java-level, requires forking
=> the part about plugin with ext deps: WONT IMPLEMENT
* at least this effort drove separation modules, and placeholder for findbugs,
and of course finding the ugly fact about home env var
+ another story, only about findbugs)
+ As @developer I want Iwant2 to no more run any tests during bootstrapping so it's easier to add new modules and because modularization has already reduced the coverage of distillery2 tests
* also the actual build of iwant already covers everything nicely
+ do it
+ delete testrunner for real and from mock wsroot
+ don't even compile tests in Iwant2 and delete them from mock wsroot
+ As @buildscriptauthor I want iwant to provide extra functionality with external dependencies as optional modules retrievable from an easy-to-use interface so I get functionality if and only if I need it
* see untar story: the first module implemented this way
+ mark done when the 1st story doing this is done
+ As @developer I want target Untarred so I can untar findbugs distribution, which is required for using it, the standalone jar would require home env setting magic
* also try to use this as the 1st case for an iwant plugin with ext deps
+ new module
+ tdd Untarred
+ functionality without compression
+ functionality with compression=gz
+ tdd usage of iwant-opt-paths
+ refactor: encapsulate current data inside WorkspaceDefinitionContext
for defining the workspace
+ also replace arrays of iwantApiModules with Set
+ split module iwant-testresources, move test tars there
+ drive with descript, tdd on lower levels
* currently not easy to do purely in java starting from wsdefdef
+ wsdefdef calls ctx.iwantPlugin().ant().withDependencies()
+ wsdef uses Untarred
+ Iwant3 passes iwant wsroot to the ctx and it generates correct
bin modules
+ @enhancement: As @buildscriptuser I want a nice error message instead of NullPointerException when Iwant does not find the system java compiler so I know to switch from a JRE to JDK
+ @bugfix: replace backslashes with slashes in emma ant script, otherwise it won't work on Windows
+ try to test: changing file.separator does not reproduce the bug, because File.getCanonicalPath() does not obey it
(keeping the method extract of script content)
+ just fix without testing (=:-O)
+ fix even the paths in the properties file of EmmaInstrumentation, that seems to be causing problems
+ manually test on Windows
+ add story about testing this after refactoring away raw Files or otherwise making this testable
+ @enhancement: As @buildscriptauthor I want to define the character encoding for JavaClasses so when it's different than the system default my classes will work
+ @enhancement: doh, encoding also for JavaSrcModule that defines JavaClasses
+ @bugfix: yet another: EmmaReport also needs backslash fix
* it's probably my fault, after all, properties files use backslash as escape?
+ @enhancement: It's not enough to add permgenspace for emmaruns, the whole ant ui of iwant may need that in a big project
+ add it and heap
+ test in real project that fails without this when cache is empty
+ @bugfix: target that is dirty because of dirty target ingredient must stay dirty even if its refresh is interrupted
* target timestamps are not checked, so dirtiness is detected only during the same run that refreshed the ingredient
+ delete descriptor when starting refresh, this way target stays dirty until a new descriptor is successfully written
+ @bugfix: As a Windows user I want JavaSrcModule to cache main and test artifacts so I don't get out of heap
+ do it (remember synchronization)
* again an untestable feature, not practically testable, but it's ok since this is basically a semantics-preserving optimization
+ manually test
+ @bugfix: It may not be enough to delete cached descriptor when refreshing, otherwise later targets in the build queue are not refreshed after interrupt
+ test:
* src:a <- target:b <- target:c <- target:d
* successfully refresh d, touch a, tell b and d to fail, refresh d => b fails, tell b to succeed => assert d is retried and fails
(- fix if needed: before starting any refreshes delete descriptors of all targets that are going to be refreshed)
+ it was ok: b deletes its descriptor so it will be dirty and cause c and d to be dirty
+ test same set up, but successfully refresh c before d
* this revealed the bug, more direct test:
+ test: target ingredient was refreshed directly on earlier run => dirty on next run
* so this bug was not only about interrupting, but just refreshing target ingredients before their dependant!
+ fix
+ not only compare descriptor timestamp to sources, also to target ingredient descriptors
+ remember to be dirty if ingredient descriptor is missing
+ this lead to another bugfix: missing source is another reason for dirtiness
+ add symbols to the 2 new dirtiness reasons
+ also test notdirty cases for both src and target ingredient cases
+ As @buildscriptauthor I want targets as paths from side effect code so I can use lazily generated files in my imperative code e.g. deploy and test integration environments
+ test with side effect that wants 2 targets to show laziness
+ new method to ctx: iwantAsPath(Target)
+ As @buildscriptauthor I want to define the test classnames for my java src modules so iwant does not try to run non-test classes even when I define emmacoverage using EmmaTargetsOfJavaModules instead of directly defining individual EmmaCoverage targets
+ refactor: move StringFilter to api model so it can be used to define the classnames
+ classname filter support to java src module
+ testsuite => constant filter (StringFilterByEquality)
+ @bugfix: EmmaCoverage created by EmmaTargetsOfJavaModules must not try to test a src module without testJava
+ test: not reproducible, it was an user error (there really were testJava)
+ but, make the returned EmmaReport not null even here, it's less surprising
* the target just produces an empty directory
+ As @buildscriptauthor I want my wsdefdef in by wsdef classpath so I can define some modules in wsdefdef, making them available already build-time, not only from other modules
+ just pass it to the wsdefctx
+ make example wsdefdef pass it, not only iwant api classes
+ test by descripting
+ As eclipse user I want to use Kepler, because it has finally fixed broken refactoring with big workspaces
+ As eclipse user I want support for the new unusedTypeParameter and also warning by default, because more is more here
+ As eclipse user I want some syntax colour for annotation keys, because also here more is more
+ @bugfix must put recent workspace path in native format i.e. in cygwin it must be cygpath -a -m so the carefully crafted workspace will be used instead of a fresh one elsewhere
+ As svn 1.7 user I want iwant to use a newer svnkit so it works with the newer working copy format
+ As @developer and @buildscriptuser I want -XX:-UseSplitVerifier added automatically to EmmaCoverage jvm args so my tests don't crash when using Oracle JDK 1.7
+ add in spex constructor
+ make it also possible to clear the default
+ upgrade iwant for iwant to make own tests pass again on 1.7
+ test on java 1.6
+ @optimization: Now that target ingredient descriptor timestamp is checked, we get false positives when target builds in less than 1 second. Find a way to get rid of this
* even if the target itself takes less than 1 second, some big target may depend on it
+ implement: target descriptor timestamp is compared with >, source with >=
+ real testing
+ As @developer I want fresh documentation on the project website so I can gradually start promoting the project
+ grep away svn co output in local bootstrapping tutorial
+ target for full website, not only tutorial
+ website content improvements
+ main features
+ remote website
+ deploy (manually)
+ As svn+eclipse user I want a newer subclipse version for the script-generated eclipse so it no more complains about javahl, after some os-level upgrade I have made
+ upgrade
+ simplify unzip function to not mention jars by name
+ @bugfix escape special characters in recently used workspace path, UTF-8 does not work
* thanks Geir Sande for the report
+ use native2ascii (comes with JDK)
+ As @buildscriptauthor I want to define a Jar target so I can publish my classes as jars
+ also Unzipped, to test the jar
+ tdd it
+ As @buildscriptauthor I want to define characteristics for my java modules so I can for example make sure only deployable modules go into each deployment
+ interfaces
+ test extending with own
+ src module support
+ bin module support, requires changes to fluent specification
+ @bugfix: JavaBinModule toString must be the main artifact name
+ test both implementations
+ implement once in superclass
+ As @buildscriptauthor I want to add iwant-plugin-ant as a dependency to my module so I can delegate some build code out of the wsdef module
+ test a side effect that reads ant plugin from ctx and prints its modules
+ inject wsdefcontext to wishevaluator
+ publish the plugins via side-effect definition ctx
+ real test
+ @bugfix: equals/hashCode for JavaModule that uses name() so Collection.contains(), HashSet etc work correctly
+ test equals and hashCode and impl
+ real test
+ @bugfix: wish scripts must work even if cwd is a symlink that points to the workspace
+ descript
+ fix failing parts
* Iwant3 asSomeone
+ real test
+ As @buildscriptauthor I want a target in a plugin for running a PMD analysis on my java source directories so I can improve their quality
+ plugin module
+ pmd target with default rules
+ html report
+ txt report
+ assert issues found from example java file
+ descript
+ expose as plugin module
+ real test
+ As @buildscriptauthor I want to use a Path to a PMD ruleset in PMD analysis so I get only the warnings that have been defined as problems in my project
+ As @buildscriptauthor I want a PMD copypaste analysis so I can improve my code
+ base class for test
+ just for fun: better syserr msg for PmdReport
+ tdd copypaste report of
+ 0 and 1 src dir
+ 2 src dirs
+ minimumTokenCount
+ As @buildscriptauthor I want to define a findbugs report of my classes so I can fix my bugs
* cannot use in the simple way, we need the "full distribution" and a home variable (sigh) so it's easiest to generate an ant script
+ descript
+ FindbugsDistribution.ofVersion("2.0.2")
+ test contains directory findbugs-2.0.2 and some jars
+ download and untar
+ FindbugsReport.with().name("fbr")
.using(findbugs(), antJars())
+ fix classpath issue and write a classloader story of it (ant-launcher needed in iwant-plugin-ant, otherwise iwant-plugin-findbugs cannot use it AND dynamically run ant)
+ also added to FromRepository, thought we'll download findbugs jar from there, but a full distro is needed
+ As @buildscriptauthor I want to define aux classes for findbugs report so it can report bugs that can only be detected by looking in the binary dependencies
+ As @buildscriptauthor I want to define runtime and testtime dependencies to my java modules so that I can more easily build classpaths
+ As @buildscriptauthor I want JavaModule to give me effective compile and run module paths for main and test so I don't need to build them myself
* compile always before run so it's possible to override
* test always before main so it's possible to override
* compile implies runtime
* runtime is cumulative
* compile is not cumulative
+ @bugfix disable parallel download, now there are failures if many downloads from the same repository
+ unittest and fix
* very trivial unit test, but maybe shields against some refactoring
+ real testing with gluent that has lots of downloads
+ real testing with iwant itself
+ As @buildscriptauthor I want to define a java module like another (auto-shoveling spec) so I can reuse a module defined in wsdefdef but make some enhancements during the actual build (like characteristics)
+ JavaSrcModule
+ JavaBinModule
+ both cases separately
+ change the spex interface of the other
* the spex api of these really starts hurting
* btw, this didn't help: dependencies won't be cloned this way
so instead I made it possible for wsdef to decorate the buildtime
modules during their definition it uses from the wsdefdef
+ As @buildscriptauthor I want to pass a collection of generator sources to follow for a srcmodule so that I don't have to convert it into an array (currently supported)
+ just do it, the overloaded method uses it so no need to test it directly
+ As @buildscriptauthor I want to clear main and test resources during specification of java src module so that I can override defaults set in my project-specific utility
* for example a project uses mavenLayout by default, and individual modules
can then declare they don't have resources
+ As eclipse user I want to enable svn and git plugins if and only if I enable them on the command-line so I don't have to tolerate their problems when I don't need the good parts
* for example egit is buggy with submodules
+ impl as optional opts
+ conditional install of subclipse
+ conditional _uninstall_ of egit (included by default)
+ As eclipse user I want eclipse-settings side-effect to refresh all binary references (classes and sources) so Eclipse won't complaing about missing references
+ As a web app developer I want an easy way of defining a web archive (war) so I don't have to generate an ant script for it
+ plugin
+ War target
+ minimal
+ web.xml under a directory Path so I can generate confs and use web.xml
from under it
+ libs
+ classes
+ resources
+ excludes
+ descript, to make sure plugin classpath is right
+ As emma user I want emma.rt.control=false by default in EmmaCoverage so that tests don't fail if the happen to open that port and because I cannot find any good use for the control port
+ add to default jvmargs
+ real test in a project with test failures
+ As eclipse user I want eclipse settings with java compliance 1.7 so that I can use the pretty diamond syntax instead of redundantly defining generic types
+ module takes JavaCompliance, default is 1.6
+ core prefs uses it for the 3 places that currently have 1.6 hardcoded
+ As eclipse user I want to skip downloading subclipse unless I want to enable it so that I save a lot of time in slow networks
+ As @buildscriptauthor I want to define the name of emma report so I can define many of them, for different sets of modules
+ As @buildscriptauthor I want to define other outputformats than the default html for findbugs report so I can analyze it by other programs
+ As @buildscriptuser I want java source modules to have debug enabled in the java classes so tools like emma and findbugs work better
+ @bugfix: add debug and encoding to JavaClasses content descriptor so they get refreshed when the settings change
+ As @buildscriptuser I want emma report in xml format, in addition to txt and html, so I can analyze it with e.g. a CI server
+ tdd
+ real test by upgrading iwant for iwant
+ As @buildscriptuser I want pmd report in xml format, in addition to txt and html, so I can analyze it with e.g. a CI server
+ tdd
+ As @buildscriptauthor I want EclipseSettings to ensure java and resource dirs of my modules exist so I can just define them, run the side-effect, refresh/import to Eclipse and start adding packages and java files
+ As @developer I want a findbugs report so I can improve the quality of iwant and also eat some dogfood
+ initial report
+ story about filter
+ As @buildscriptauthor I want to list my java src modules to findbugs so that I don't need to iterate them myself and add their optional main and test javas and runtime deps myself
+ tdd that adding modules leads to correct analyze fodder and aux
+ real test with iwant
+ As an @eclipseuser I want to define a bigger value for formatter line length so I can type long lines and use autoformatting
* line in file org.eclipse.jdt.core.prefs:
+ tdd
+ real test
+ As @developer I want to mention reusing code between build-time and run-time on the webpage for advertisement
+ As @developer I want svnkit upgraded to 1.8.3 so it works with the current svn workingcopy version
+ As @developer I want testarea root to be found by file path, not as resource from classpath so a classpath directory won't be touched by tests and emma report target is dirty only if I have really touched ingredients (sources)
+ As @developer I want TestArea to be final and all subclasses deleted, to save some LOCs
+ @bugfix: emma coverage must not contain a null artifact if a dependency (e.g. the module itself, if it's an integration test) has no main artifact
+ @bugfix: emma report must succeed even if some module has no ec file because of zero coverage (and the report must contain the non-covered code)
* it's an unfortunate feature of emma to not write the ec file in this corner case
+ As @developer I want utility code to handle mock environment so I can reduce LOC in tests
+ env that encapsulates mocks
+ optional base class for tests that makes refs to env parts easy (zero diff)
+ one test uses it
+ stdout and stderr capture
+ tmpDir
+ wsRoot related methods in IwantTestCase, to minimize diff to modified tests
and the risk of confusion between testarea root and wsroot
+ use everywhere (except in some more special tests)
+ As @developer I want EclipseSettingsTest to inherit IwantTestCase to reduce LOC
+ move SideEffectContextMock and WsInfoMock to apimocks
+ do it
+ The same for EclipseSettingsWriterTest
+ As @developer I want a test class name filter instead of suites for tests
of iwant so the module splitting will be easier, and also adding new
+ As @buildscriptauthor I want a coverage report using jacoco so that I can use an alive project instead of the dead emma
* also: @bugfix emma fails if path contains special characters (case vö
+ create module iwant-plugins-jacoco
+ tdd
+ distribution by version, unzipped, jars from it
+ jacoco distro, jars from it
+ instr
+ exec
+ report
+ convenience creation from javamodules
+ real test
+ As @developer I want to split distillery2 so it will help me in the later split into bootstrapper/core/plugins and also in understanding and maintaining clean design
+ move interfaces for wsdef and wsdefdef (with deps) to a new module, iwant-api-wsdef
* cannot be in api-model, they need javamodule
+ fix Iwant2
+ fix textual java sources in tests
+ create same module in mock wsroot
+ fix ref in Iwant3.iwantApiClassLocations
+ and add ref to another class in distillery2, with todo comment to remove
when no more really part of api
+ fix textual refs to other moved types
+ fix textual ref in Iwant3Test
+ move mocked IwantWorkspace (just in case)
+ fix dummy project (manual testing)
+ test tutorial works
+ commit and fix/notify workspaces using iwant
+ more splitting, either in this story or a new one
* well, why not now
+ iwant wsroot finder
+ split target impls from distillery2 and api-model
+ api-core
+ SubPath
+ core-download
+ Downloaded
+ FromRepository
+ TestedIwantDependencies
+ more to api-core
+ Concatenated
+ HelloTarget
+ StringFilterByEquality
+ emma => iwant-deprecated-emma
+ AntGenerated
+ whole api package (prod)
+ tests of api package
+ delete unnecessary "compiler fodder" from mock root
+ rename distillery2 to entry3
+ As @developer I want iwant's own module definitions optimized to fields so it will be a lot faster to make wishes
* now the methods create module objects many times, recursively
+ As @developer I want tutorial to use a copy of the workspace root that is only refreshed when some relevant file is modified so building the tutorial will be lazy
+ first explicitly mark all toplevel directories as ingredients to the copy
+ later, after moving all relevant modules under essential or optional, just
use them, leaving documentation out from them
+ delete dead as-iwant-developer/i-have/wsdef/net/
+ As @buildscriptuser I want iwant to only checkout the code it really needs so I don't need to wait for all the plugins I don't need
+ split distillery
+ entry2
+ entry
+ the rest (test utils for entry)
+ restructure dirs so essentials one and plugins another dir
* essential, optional and private
+ put entry under essential
+ modules needed only by iwant's own build and test under private
+ plugins under optional
+ put the rest under essential
+ split IwantNetworkMock from entry to separate private module iwant-entrymocks
+ split
+ also iwant-entry-tests needed
+ and iwant-testarea to private
+ fix external (users') references to entry
+ only checkout essential, plugins are checked out if used
+ first move iwantwsroot finding and examplewsdef under essential
+ test iwant wsroot finding
+ test Iwant2 puts wsroot marker in classpath when calling Iwant3
+ don't use junit when compiling/running, not needed anymore
+ cleanup: remove junit handling from Iwant and tests
+ then only checkout essential (keep subdir essential at checkout,
otherwise modules are not found)
+ also make plugins svn exported
+ new target SvnExported
+ finalize
+ remove unneeded iwantWs from WorkspaceDefinitionContextImpl
+ make SvnExported single-threaded, svnkit seems to warn, also
better behaviour against the svn server
+ real test
+ bugfix: keep revision in the end of svn url when appending subpath
to it
+ more bugfix: export essential directly, remove prefix "essential/"
from refs, don't pass wsroot, pass essential to iwant2->iwant3
+ As @developer I want CopyOfLocalIwantWsTutorial to get a context for ingredients() so it can find all essential src/main/java dirs from wsroot and is not dirty when e.g. eclipse settings have changed
* maybe later something like this
* pass wsRoot as ReadAccessToFile
* enough functionality to that class for finding essential main src dirs
+ but for now, at least, kiss (minimize changes)
+ just use wsrootfinder
+ As @buildscriptauthor I want iwant to log the (first) path that renders a Target nonfresh so I can more easily debug my Target code, Source timestamps etc if laziness doesn't work
+ just filelog, without automatic testing
+ manually verify from log after jacoco-report
+ @epic: As @developer I want the main branch deleted and replaced with distillery code split to many projects so distillery will be more maintainable
* don't split before deleting old code, otherwise it's difficult to see what is dead
- reimplement features that are now only in the main branch
+ ScriptGeneratedContent: see separate story
* JunitResult seems to be thread-unsafe so let's skip it
( it uses ant and suppresses sysout)
+ checksum of downloaded: any tests to copy?
+ split distillery2
+ api
+ planner, planner-api and planner-mocks
+ eclipse-settings
+ remove all Suite classes, by now it's clear they are not needed
+ remove refs in module defs
+ remove the classes
+ verify test coverage still the same
(- what else)
(- after split, take WsRootFinder and ExampleWsDefGenerator into use in Iwant3Test
* actually, no split needed, but no need for WsRootFinder)
+ As @buildscriptauthor I want a default test classname filter that
detects typically named tests so I don't have to type the same filter
over and over again
+ the filter
+ make it the default filter in javamodules
+ As @buildscriptuser I want svn exports to be downloaded to global cache so workspaces don't need to download them separately
+ do it like Downloaded does it
+ @anticipated @bufgfix As @buildscriptuser I want download/svn export to first use different name and only then rename so failure won't produce a corrupted artifact
+ fix for svn export
* not as strictyly needed for download, it first downloads to ram
* it could fail during md5 check but won't fix for now
+ As @developer I want junit 4 tests so I can name my test methods in a declarative way
+ experiment with one test class, convert others case by case
* recent enough junit was already in use, works nicely together with junit 3 test classes
+ @bugfix: DefaultTestClassNameFilter toString must be constant
+ As @buildscriptauthor I want test runtime dependendies in eclipse classpath so I can run the tests in eclipse
* unfortunately this means that developers can accidentally create compile, even main compile, deps when writing code
+ real test, where module test passes by iwant, not by eclipse
+ make dep collection test runtime instead of compile time
+ fix dep refresh to use same collection
+ As @buildscriptauthor I want a tutorial for defining java modules so I know how to do it easily
+ descript
+ define modules first on low level
+ generate eclipse settings
+ create code, target from main classes
+ define modules using JavaModules from the plugin
+ fix edit subpackage removal: require prefix "editversion"
+ target all jars as classpath string
+ @bugfix: use effective test runtime deps for eclipse settings, now runtime dep of binary is not included
+ tdd using EclipseProjectTest, finer grained than EclipseSettingsTest
+ real test
+ As @buildscriptauthor I want an utility for defining modules so that they are automatically added to an allSrcModules collection so I don't need to maintain such a collection myself
+ take from real projects and polish for general use
+ src module defs, auto collecting
+ default and custom settings
+ split to a plugin, since Jar is in a plugin (needed later:)
+ bin modules
+ artifact helpers
+ main artifact jars
+ test artifact jars
(- dep artifact collections postponed until more detail:
JavaModule already gives some of these)
+ test plugin deps by implementing story about javamodules tutorial
+ use in real project, replacing its own version of this
+ use in iwant itself
+ also clean up the wsdef
+ As @buildscriptauthor I want to define java compliance of sources to JavaClasses so I can enforce/tolerate syntax
+ refactor: Iwant.compiledClasses takes javac options instead of just the debug boolean
+ test JavaClasses passes given options w/wo debug
+ tdd source compliance
+ As @buildscriptauthor I want the example iwant-from to contain an example of a working iwant url so I don't need documentation to edit it
+ As @buildscriptauthor I want the example iwant-from to have the url commented out and Iwant to give a friendly failure if I try to use it without editing so I don't accidentally miss the step in the wizard
+ As @buildscriptauthor I want eclipse-settings and side-effects mentioned in the wizard help output so I know to use them if I need/want
+ As @buildscriptauthor I want FromRepository to accept group with dots instead of slashes because that's how it's documented in pom.xmls
* of course, keeping support for slashes
+ As @buildscriptauthor I want the created wsdef package and classname to match the values given in ws-info so I most probably has less to modify afterwards
+ also put WS name to proposed provider class
+ refactor: build proposed package and name in dedicated methods
+ deduce package and name proposal
+ robust simple names
+ package
+ fix tests
+ fix tutorial
+ fix name: WsInfo.wsdefClass -> wsdefdefClass
+ also change module name from WS-workspace to WS-wsdef
+ fix module names in tutorial wsdefdefs
+ real test
+ fix: example wsdef creation fails
+ log wsroot marker
+ reproduce with remote tutorial
+ fix url in svn:external
+ fix bug
* not good to find wsroot, since subdir "essential" is named
"essential@REV" when exported from svn
+ replace wsroot finding with essential finding
* mock wsroot still needed
* actually, a test bug caused by introducing "essential"
was now found and fixed (assert file does NOT exist)
+ verify
+ As @buildscriptauthor I want bootstrapper to be less verbose when svn exporting so I can concentrate on the essentials
* also I want to minimize the "| grep" tricks to minimize the tutorial
+ do the change
+ verify in tutorial
+ As @buildscriptauthor I want to fluently define a directory with subdirectories and copies of paths so I don't need to write a new Target implementation for example for distributions
+ tdd Directory
+ As @developer I want the tutorial defined by a set of iwant targets so I can split it for readers' convenience and speed
* and also maintainability is increased
+ bootstrapping from local iwant without versioning
+ one common wsdef creation wizard tutorial
+ cp -a given bootstrapped env
+ create wsdef and wish hello
+ bootstrapping with svn using svn:externals
+ wsdef creation using both local and svnext
+ make local create iwant-tutorial dir also, because svn version does
+ in wsdef tutorial cd to iwant-tutorial
+ in wsdef tutorial use iwant-tutorial as ws name
+ another wsdef creation target
+ hello world with eclipse
+ continue from initial ws
+ move eclipse settings and modification here
+ tutorial directory with index page
+ one tutorial document per nontrivial feature
+ ext lib in wsdef
+ antgenerated
+ ant-cli
+ scriptgenerated
+ using-iwant-plugin-ant
+ use style.css file from tutorial index and descript docs
+ define descript doc title in one place (java) and use as html page
title, section header and link text
+ links: prev, up, next
+ remote bootstrapping without svn:externals
+ tutorial takes list of bootstrapping pages
+ also: concepts explained before bootstrapping
+ name other bootstrapping styles "alternatives"
+ remove the old files
+ edits
+ fix link to tutorial index
+ As @developer I want to clean up and enhance jacoco plugin so it will fully replace emma
+ @bugfix: copy missing files (resources)
+ simplify resource copying of instrumentation: don't follow the example in jacoco tutorial (**/*.class)
but instead use **/* so no extra copying is needed
+ filter:
+ whole module: just don't pass uninteresting modules when building JacocoTargetsOfJavaModules
* test it works even if interesting modules depend on the uninteresting
* filtering by classname requires online instrumentation => new story
+ use in iwant
+ refactor
+ reuse test setup code
(- reuse ant generator code
* nah, duplication is so small)
+ other features?
+ read through emma tests and find what is missing
+ jvmargs, -XX:-UseSplitVerifier
(- other?)
+ As @developer I want java 1.7 compliance so I can use the more ergonomic diamond syntax
+ use the -source javac option
+ fix all diamond warnings
+ polish: JavaSrcModule passes compliance to JavaClasses
+ required setting default to 1.7, otherwise a lot of output was affected
(warning about bootclasspath with 1.6)
+ website publish script
* As @developer I want this so I will publish often
+ also publish
+ logo
* As @developer I want a logo on the website because logos are so nice :)
* just a quick version, later it can be improved
+ final words for tutorial
* As @buildscriptauthor I want some pointers to what to do after reading
the tutorial so I can learn things it does not mention
* also: as @developer I want to challenge readers to give feedback so
I can prioritize work to better server them
+ @bugfix: favicon link to tutorial index and all tutorial pages
+ As @buildscriptauthor I want a convenience superclass for my Targets so I can define contentDescriptor and ingredients at the same place
* TargetBase
+ tdd it
+ use in some targets
+ robust handling of nulls in descriptor
+ robust escaping of newlines in descriptor
+ As @buildscriptauthor I want all Targets to extends TargetBase so they show good compact example
* also, as @developer, for maintenance
+ Concatenated
+ ConcurrencyControllableTarget
+ CopyPasteReport
+ Directory
+ Downloaded
+ fix method name (parameter, not attribute)
+ EmmaCoverage
+ EmmaInstrumentation
+ EmmaReport
+ FindbugsDistribution
+ FindbugsReport
+ JacocoCoverage
+ JacocoDistribution
+ JacocoInstrumentation
+ JacocoReport
+ Jar
+ JavaClasses
+ PmdReport
+ ScriptGenerated
+ SubPath
+ SvnExported
+ As @buildscriptuser I want an installation of Eclipse Luna SR1a so I can use its new features
+ As @eclipeuser I want generated catch clauses to throw, not just print stacktrace, so my code is robust all the time
+ two templates in the autoconfigured eclipse
+ also upgrade, there is SR2 of Luna available
+ As @buildscriptauthor I want to use 1.8 as JavaCompliance so my code compiles and run nicely in java 8
+ new enum value 1.8
+ test compilation of code that uses 1.8 features
+ assert no warnings
+ 1.7 warns about missing bootclasspath
+ simplest possible way to put the 1.7 jre/lib/rt.jar in bootclasspath
(- bootclasspath option for javaclasses)
+ define bootclasspath using rawArgs (new) of JavaClasses
(- also now's the time to add: target compliance for JavaClasses
nah, it's automatically the same, for now ok)
(- javamodule uses compliance for both source and target)
+ javamodule.compilerRawArgs
+ use 1.8 for iwant modules
+ don't test emma: it does not work with 1.8 bytecode (now it's
finally dead)
+ fix tests: now extra warnings about bootclasspath
+ make 1.8 default => no bootclasspath changes needed
(and iwant's own build again green ... =:-O)
+ upgrade findbugs to support 1.8 bytecode
+ don't specify compliance in ui: that compilation is for current jvm
+ entry
+ bash
+ ant
+ remove jvm options no more supported
(1.7 users must add them explicitly)
+ MaxPermSize
+ UseSplitVerifier
+ use 1.8 as default everywhere
+ upgrade findbugs to 3.0.0 that works with java 8
+ test by building the remote website
+ upgrade iwant for iwant
+ As @developer I want trivial coverage issues fixed so I can more easily find uncovered code and cover it
+ test that documents and tests synthetic or otherwise automatically generated code
+ unused default constructor of utility classes
+ enum valueOf and values
+ reused and tested nonNull check for mocks
+ @bugfix: add jvmargs as parameter to JacocoCoverage
+ As @buildscriptauthor I want to have fresh cached Path, not only Target, in my side-effect so I can access e.g. iwant api classes
* just change the signature (also better name)
+ small hackfix (cast) to a mock impl of the interface
+ @bugfix @maintenance: replace "" with "" so bootstrapping again works with the changed url
+ fix
+ update iwant for iwant to fix bootstrapping also here
+ real test
+ fix (and upgrade) svnkit url, they changed them so bootstrapping no more works
+ fix it
+ upgrade iwant for iwant
+ fix: remove ibiblio usage, it is no more, use
+ fix as much as possible
+ upgrade iwant for iwant and fix more
+ fix: scala library as dependency to tutorial-wsdefs module
+ As @buildscriptuser I want iwant to follow redirects so I can declare dependencies to sourceforge
+ test with vert.x server that responds with 301
* hmm, maybe jdk has fixed urlconnection, it does follow redirects
+ manual test with a workspace that had problems
* problem with
that redirects with 301 to same with https
* using https redirects with 302 to
+ test with redirect from http to https (and vice versa)
* this reveals that redirect is not followed
+ implement redirect follow
+ commit, it seems to work although https tests fail: they don't trust the embedded vert.x cert
+ fix: check if conn is HttpURLConnection, e.g. during tests it's FileURLConnection
+ unignore https tests when I've found a way to _temporarily_ disable certificate checks
* oh cm'on what hacking to get this done!
+ As @buildscriptauthor I want coverage for modules that have TestNG tests so I don't have to use junit only
+ descript
+ wsdef uses testng plugin
+ a module declares it uses TestngRunner
+ new interface TestRunner, java module may optionally define
+ new plugin: testng, with TestngRunner
+ write test, run, fix, rerun, cat jacoco report
+ extract existing JacocoCoverage test running to a JunitRunner
+ remove unnecessary taskdef of jacoco
* nothing more to do: after all runner is just a cli replacement for junit
+ TestngRunner passes correct args to TestNG
+ JacocoTargetsOfJavaModules passes as main: runner defined by javamodule or junit as default
+ plugin deps
+ verify descript details ok
+ TestngRunner cannot be found => iwant-plugin classes to test-time classpath
+ target def ctx that gives them
+ cleanup: common super for target def ctx and s.e. def ctx
* not enough to put as runtime deps for jacoco report because
tests are run without ant runtime deps
+ make plugin testdep of the module
* UGLY: modules need wishevaluationctx => targets(ctx) and
sideEffects(ctx) need to save it to file and modules just needs
to trust they have been called first :( (another story will fix)
+ As @buildscriptauthor I want to declare a given version of scala for a module so I can define java classes as a mixture of java and scala sources
* don't bother modularizing this, it's good to have scala support easily accessible to all modules
(even iwant workspace definitions and iwant itself)
+ descript driven api
+ JavaSrcModule ... scalaVersion(ScalaVersion.of("xxx")).mainScala("src/main/scala") ...
+ generate eclipse settings
+ java and scala files with cross dependency accross the language border
+ compile and run them
+ make it pass: the implementation
+ main scala&java => java classes that depend on scala classes
+ scalac works
+ copy scala classes to java classes by declaring them as resources
+ proper output in descript
+ deps for scalac
(- only scala => only scala artifact
* no: it's cleaner that the artifact is always JavaClasses
* if there is a bug in scala-only modules, write a story)
+ all the same for tests
+ done features
(- only scala => only scala artifact
* see main above)
+ eclipse settings
+ cleanup
+ scala support for iwant-tutorial-wsdefs so it compiles
+ make iwant-tutorial-wsdefs compile in eclipse
+ manually install scala plugin
(- maven-style src dirs if required by the scala plugin)
+ add dep to scala library
+ remove redundancy: 2 methods copied from AntGenerated to ScalaClasses
+ move to dedicated iwant-api-antrunner, use everywhere
+ fix iwant2 and mock-wsroot (bootstrapping)
+ mention that srcmod.mainJava and mainScala make no difference
+ just do it in javadoc of mainScala
+ @bugfix: classload api-antrunner in Iwant3
* currently parts of tutorial disabled so this wasn't revealed (shame!)
+ delete emma plugin, it's dead with java 8
+ before deletion, see how to assert err() in jacoco tests like in emma tests
* jacoco forks a new jdk process so our control stream redirection and flushing is limited
(verified by printing
in the jacoco test and code run by it)
* so we just have to live with it
+ document this in jacococoveragetest
+ delete the module
+ commit
+ fix: iwant2 must not try to compile it
+ upgrade iwant for iwant and delete own use of it
+ delete from testediwantdependencies
+ any other refs? if not, done
* just one mention of emma in, comparing jacoco behaviour to it
+ As @buildscriptauthor I want a method for getting main jars with version numbers from my modules so I can publish them in a context that uses them
+ JavaModules.mainArtifactJarsOf
+ JavaModules.mainJarOf
+ As @buildscriptauthor I want a method for getting a sources jar for my module so I can publish it, with or without version
+ support multiple directories in Jar
* get rid of the subdir feature: if needed, it can be implemented with SubPath
+ JavaModules.srcJarOf
+ As @buildscriptauthor I want a method for getting the runtime dependency modules of a module so I can build the runtime classpath or include the deps in a distribution package
+ JavaModules.runtimeDepsOf
+ @bugfix As @buildscriptuser I want iwant to just warn instead of crashing if a declared resource directory is missing so that I don't need to remove the declaration if I (temporarily) delete the last resource
* especially with git this is an issue, since a new clone doesn't create the directory if there is nothing in it
+ fix
+ real test in iwant-demo
+ As @buildscriptauthor I want JavaModules in classpath already for wsdefdef so I can more easily define modules to be reused between code that builds and code to be built
+ move stuff around
+ download ant jars already in Iwant2 so they are available for Jar
* had to disable stderr assertions from AntGeneratedTest, see @antstderrbug
+ upgrade ant to 1.10.1 to see if it helps with stderr, it didn't but let's keep it
+ real test with iwant-demo
+ As @buildscriptauthor I want an easy way of declaring the java file of my custom target its own ingredient so I don't get cache invalidation while developing the target code
+ split some modules in preparation for getting a needed context to TargetBase for this
(- design a cycleless way to inject a suitable context: too difficult with the current modularization)
(- even better: automatic tracking
+ Iwant3 compiles wsdefdef only if needed
* this should avoid compiling wsdef
* bonus: this feature will also make targets dirty when upgrading iwant
* bonus2: performance shouldn't get worse, at least
+ not enough: Iwant must not compile bootstrapper unless needed
(- all targets automatically dirty if not newer than all classpath items
* hmm, but this will ruin performance of targets that don't depend on modified targets so
better to keep this explicit, the responsibility belongs to the target author))
+ separate tool for finding java files and locations of classes
+ tdd the tools
+ change the tutorial to use java file finding
+ manually test class location finding in iwant-demo (the javabean generator)
+ As @developer I want newest descript in use so the html will be better and easier to diff while development
+ upgrade descript
+ fix css
+ As @developer I want the main webpage improved as per feedback so it can advertise iwant better
+ advertise iwant-demo
+ advertise examples (iwant-demo and tutorial) earlier
+ subtitles to help with reading
+ fix backlog link
+ italics for the "quote" in the beginning, with keywords in bold
+ BOLD (both style and attitude) adjectives to prefix the features list bullets!!
+ As @buildscriptuser I want xargs used with option -r in the tutorial so I don't get into trouble (hang) if e.g. i call "xargs cat" with empty input
+ Also fix typo in index.html
+ As @developer I want the current website polished and deployed so I can do more advertising
+ upgrade iwant for the remote website target
+ find and editor div width that looks good in chrome
+ fix some edits that seem to be nonminimal after some changes: scalamodule
+ make navigation div smaller
+ deploy
+ As @buildscriptauthor I want nonfixed font size on the web page so I can see it properly
+ use em instead of px so browsers support zooming better
+ make the font bigger so it's readily bigger
+ make text div less wide so it's easier to read
+ deploy and get feedback
+ As @buildscriptauthor I want to declare the x flag for a file under a Directory so I can easily define an application distribution directory with a start script
+ tdd
+ also now is a good time to move the name out from copyOf and into a separate method
+ @bugfix file under Directory must mention executable as parameter so changing it will render the target dirty
+ As @buildscriptuser I want iwant to use the number of processor as the default workerCount so that I can automatically benefit from parallel computation
+ as @buildscriptuser I want JavaModules.binModule to have sources by default to I can navigate to them when using 3rd party libraries
* also: as @developer I want FromRepository to return an object that remembers group,name,version because I know it helps e.g. when generating poms
+ FromRepository returns GnvArtifact<Downloaded> instead of Downloaded
+ it also requires type: jar or sourcesJar
+ JavaModules.binModule includes sources by default
+ upgrade iwant for own projects and do some real testing
+ make binModule methods public static for wsdefdefs
+ @bugfix del of directory must succeed even if there is a broken symlink under it
* File.exists returns false for a broken link
+ try to delete anyway, ignoring (logging) failure
+ as @buildscriptauthor I want to define scala version freely, not just a predefined factory method, so I don't need to wait for an iwant upgrade when upgrading scala
+ factory method ScalaVersion.of
+ potential @bugfix instantiate jars of ScalaVersion only once for less heap usage
* a project started getting OutOfMemoryError: GC overhead limit exceeded after upgrading scala
+ also make the constructor public, just in case user wants to customize things
+ As @buildscriptuser I want SubPath to point directly under the original path without copying so I don't have to waste disk space
+ As @developer I want to migrate from sourceforge to github so that:
* I can bootstrap from github because svnkit makes it (currently) hard to do
in a reliable way
(checkout failure is swallowed => can't make iwant keep its global cache
* people trust the host
* "I avoid like the plague"
* "I think you'd benefit if you were to use github"
* people find the project (seems google ranks low)
+ create github project and migrate old commits from svn
+ initial that warns that things don't yet work without svn
+ iwant/
+ gitignores
+ initial github pages index.html:
+ current web page under custom domain
+ buy domain:
+ set up pages to use the domain (from dir /docs)
+ script that ensures fresh cached website and repopulates docs from it
+ publish webpage
+ remove references from website
* keep bootstrap refs, that's the only way of bootstrapping, and will be supported for some
period even after adding github bootstrap support
+ replace link with a ribbon from
+ backlog.txt link
+ checkout from sf -> clone from github
+ remove contact via sfnet, only email
+ license (also rethink what it shall be)
* play it safe: MIT instead of LGPL (Thank you Richard M. Stallman for everything, but as iwant
developer I want my tool to be used even by the most paranoid companies; also: as a FOSS believer
I belive real freedom doesn't force freedom upon anybody.)
+ remove svn keywords from bootstrap files, to avoid unnecessary git diffs
+ bootstrap from github
+ @bugfix retry if unzip fails so bootstrap failure will be seen on every retry
(- iwant-from ends with "zip" => download and unzip instead of svn co)
* nah, github only supports downloading the whole repo
* besides, now is the time to simplify: just download it all anyway, it's not big
* also, drop svn checkout support: *if* we lose github zip, we can replace it with something else
* this is a big change, but just start doing, if it gets ouf of hand, split to "preparatory" tasks
* yeah, at least UnmodifiableSource/ModifiableSource
* also, drop support for re-export (for file urls): when using local uncommited iwant, handle this
with external scripts
+ prototype script for wgetting all 3 bootstrapper files from github (there is no 1 download link)
+ leftover from considering supporting "has-modifiable-content" for iwant-from:
+ more friendly error message when iwant-from file is not good: give example content to stderr
+ modify descript tutorial
+ text of remote boostrap
+ local bootstrap
+ local tutorial must delete cached "unmodifiable" iwant zip and zip.unzipped
* another option would have been to put timestamp in the zip file but this would just grow
the global cache
+ tdd
+ Iwant, removing old svn tests and code
+ Iwant2
+ take plugin src from the already downloaded src
(- move svn functionality to SvnExported: nah just delete svn functionality)
+ try if tests now pass in clone that is not a svn workingcopy
+ fix: IwantTest must assert existence of a mockwsroot dir that has content
* git doesn't version dirs, unlike svn
+ fix: mockwsroot must have a .keep file under each src/main/java Iwant2 tries to find
+ fix: module iwant-testresources doesn't have src/main/java, fix module def
+ fix the fix: ah, main resources without main java is not supported so add a .keep file
+ fix: touch private/iwant-mock-wsroot/essential/iwant-apimocks/src/main/java/.keep
* that did it :)
+ make tests pass in a clone that is not an svn workingcopy
* work in a workingcopy that is both a github and wc
+ add ignores so both vcses show empty status
+ remove svn bootstrap and tests that svn export from workspace itself
(- SvnExported uses svnkit directly, not via Iwant: deleted the class)
+ after push: remote boostrap
+ manually do in iwant-demo
+ push to iwant repo so it will be available at
+ in descript
+ wget that
+ edit the wanted commit to it
+ chmod u+x it
+ run it
+ and continue as before
+ modify text
+ visually review the result
+ fix a css class ref
+ publish
+ rename IwantNetwork.cacheLocation to cacheOfContentFrom
* otherwise one thinks that it returns the cached zip file, not content of it
* doing it now because there are other breaking changes anyway
+ make Iwant.wishedIwantRootFromUrl static
+ remove commented out code from Iwant
+ for each project take into use
+ update scripts that fetch the bootstrapper
+ iwant-demo: done as spike for the new bootstrapping
+ (some) others
+ iwant itself
* some changes were needed: it has been a while
+ fix eclipse warning: different name for each mock wsroot .keep file
(now they are resources hiding each other in the classpath)
(- later: remove the plugin concept: they are already downloaded so no further price on just
having them unconditionally in the classpath
* not quite: their dependencies need some specifying)
+ remove checked exception from ExternalSource constructor
+ do it
+ unit test for the wrapping
+ remove catches/throws
* oh, I should never have added that exception to the signature...
+ experiment: maybe if I choose over after all...
* yes, site works together with this site so that's going to be the domain
+ import non-svn clone to eclipse and see things work
(* svn repo is now archive and won't get changes from github: no, changed my mind below)
+ rename package to org.fluentjava.iwant
+ do in branch, things will break
+ just move files without changing package declarations => git hopefully can follow history better
+ fix package declarations for compilation
+ script handles most
+ manually fix ExtendedIwantEnums (part of own build)
+ fix tests etc that depend on the old package name
+ manually fix findbugs fodder (they are txt files, not java)
+ regenerate (and probably fix) tutorials
* ah, descript was svn:externals, copying for now, fixing later
+ fix ant cli manually
+ remote tutorial
+ temporarily take from branch
+ bring refactor to so we can keep on using svn:externals bootstrapping in svn projects
+ git pull
+ generate+handtune svn mv commands, adds, rms
+ warn about migration in project
+ mention clone from github in description
+ point homepage to new domain
+ after verifying changes, commit to
+ bring back svn:externals bootstrapping tutorial and use the refactored revision
+ upgrade and fix build for git: fix packages in iwant imports
+ fix build for svn: use commited revision which is able to use iwant from github
+ see if more explanation is needed for svn:externals tutorial:
"if your project uses svn, you can also..." or something
+ make sure iwant bootstrapper is versioned for iwant: otherwise there is no guarantee
a user has called iwant/
+ rename package of own build classes
+ now that we change things: better debug messages for entry: instead of "downloaded name"
print "Downloading to <CACHED>" etc
* now nobody thinks the task was already done but Iwant is doing it
(whoops, not really part of this feature, forgot we are in a branch)
+ migration script for user projects
+ write it
+ oh, before I forget: organize imports & format after the package rename
+ document it in github readme, a news section
+ link to the readme from webpage (mention news are there)
+ merge to master
+ make remote tutorial take from master again
+ publish webpage
+ update site
+ make webpage redirect to
+ fetch descript with iwant, not relying on svn:externals
+ As @buildscriptuser I want to define checksum for findbugs so that I don't get mysterious failures when the server returns crap
* sometimes sourceforge returns an html error page instead of a proper error code
* the proper fix for this is to migrate to spotbugs (hosted by github)
+ require the md5sum
+ constants for the used versions
+ As @developer I want mkdirs return value findbugs issued fixed so I can concentrate on less trivial issues
+ Iwant.mkdirs (surprisingly many corner cases for this case assumedly handled by a standard library!)
+ call it everywhere
+ do the same for Iwant.del
+ fix some trivial warnings like "could be static/final"
+ commit, upgrade iwant and fix for own build
+ use descript from github ( link is broken)
+ migrage the descript project to github
+ fix download url
+ update iwant to test in tutorial
+ fix descript link on webpage
+ update webpage
# below: stories implemented earlier but closed a lot later
+ As @buildscriptauthor I want to pass environment variables to a module's tests so I can use a (native) tool that needs them
* manipulating envs from java is 1) a dirty hack and 2) not helpful, since it's just a copy, not the real env observable by a launched child process so tests cannot do this at runtime
+ pass them to the ant script running junit for JacocoCoverage
+ string value
+ path value
+ define for JavaSrcModule, too (no dependency to jacoco)
+ dedicated class for env, after all
+ JacocoTargetsOfJavaModules uses when creating JacocoCoverage
+ dep tracking
+ test env is a parameter
+ path value is an ingredient
(- real test with the tool that drives this story: file a bug if this doesn't work: the usecase is not valid anymore)
+ As @developer I want tests for impossible enum switch cases so I can get 100% test coverage
* generate extended enums, use in test
+ OrgEclipseJdtCorePrefs.asPropertyLine
+ OrgEclipseJdtCorePrefs.valueToEclipseValue
(- others?: just add them if you find them)
+ As @buildscriptauthor I want to use bash by defining targets as scripts so I can use iwant with shell and editors only, without having to launch a java IDE (or having to even know java)
* difference to ScriptGenerated: here the script defines ingredients and name,
not just the recipe; also script is a separate source file, not dynamically
* iwant will provide libraries for different scripting languages
+ spike solution in private ws
+ plan new requirements that will help in proper impl
+ ingredients phase needs to be able to find the script from
under wsroot
* option: TargetDefinitionContext needs to give wsroot
* downside: users may misuse this
* option: the target casts the iUse to something that gives it
* TargetBase needs it in constructor so cast comes from targetdefctx
* option: when engine asks for target list, it will go through it, detect
these special targets (by an interface) and inject a needed context to them
+ decide: impl the last, it will help in finding ingrs by name
(- funnel call to targets through one place
* no, needed only when wishing as path (or content))
+ ingredients must be found by name
(- refactor: remove getter ingredients() and use the
ingredientsAndParameters solution for all targets
- make all targets extend TargetBase
- move the impl away from TargetBase, to a place where ingrs and params are needed
* no, too difficult: ingredients and contentDescriptor are used a lot in
target unit tests)
* use the context created above
* iUse.ingredientsNamed("rolename", "ingrname")
(- don't require the targets to be full shell scripts but instead
require them to just define functions ingr.. and path and source
them from the script to run
* no, otoh, it's better for understanding and debugging to run them, also
there may be cases where user doesn't want to delegate to our library)
+ name for the target
* TargetImplementedInBash
+ tdd the solution
* driving test needs to be more high-level than one that just calls the target methods
like ingredients and path
* too difficult to test e2e from java: bootstrapping of iwant
+ ok, so then plan: not-quite-e2e
* entry is iwant3
* do as Iwant3Test, but here we can (must) use real iwant essentials
+ ingredientless target
+ make script itself ingredient
+ execute using ScriptGenerated
+ pwd is an empty subdir of tmpdir, for easy use of *
+ target with explicitly named ingredients
+ make tests pass with iwant, not only in eclipse (use resource dirs, Iwant2 must copy them)
+ run bash test during jacoco-coverage
+ ergonomics: rerun ingredients before path so the names will actually be used as bash variables
=> no need to refer by path name anymore in the path function, also practically impossible to
refer to ingredient without declaring it
+ test deprefs syntax bash functions
+ also test and fix behaviour with windows backslashes (rolleyes)
+ java tool that finds executables in a given directory and returns .sh files
as list of TargetImplementedInBash
* split contexts into separate "services" when different contexts extend more services
(- target can declare many different instances of it
* example: find image files, generate thumbnail targets for all)
+ it's easier, and probably better for the user in the long run, to require to declare all target instances
+ integr test: params
+ don't call java *.sh finding magic, but a factory that consumes
+ pass test with hardcoded java target instances
+ tdd: really execute, parse its output, create instances from it
+ remove redundancy btw ingredient type-name-value and indented-string[] parsing
(- find sources and generate target instances for them
* no, even in java we don't do this)
+ descript
* most probably Iwant2 needs to copy iwant-api-core resources
+ wsdef
+ article
+ fix classpath by copying resources
+ fix unit test: add mock resources to copy in Iwant2Test
+ also add a test that resources are indeed copied
+ real test
+ make target
+ fix problem: ext-jar-list-numbered depends on target from java: jar-list, dep resolve fails
+ test more
+ add runtime assertion that path names must not contain "::", otherwise the deprefs syntax will break
+ descript target with ingredients
+ log and ingredient parsing only to file, not stderr
+ separate log for this: ~/
+ also mention path in "please define targets" error message
+ replace more stderr logs with filelogging
+ descript multiple instances of target (target with parameters)
+ simplify params in junit tests: don't bother naming function params, do it like in the
descript example, naming only once
+ cleanup of target creation
+ remove need for cast
+ is it possible to pass targetdefinitionctx? maybe split targimplinbash into dedicated module?
+ split modules anyway, it's never harmful
+ create mock for iknowhatimdoingctx (in this module for now)
+ make it possible to use defaults or override:
+ path to
+ friendly error message when is not found
(- clean junit tests: take file from wsRootHasFile( and use in assertions
* not valid anymore: is a Path now)
+ utilize friendly error of " not found" in descript
* more tasks later
+ As @buildscriptauthor and @buildscriptauthor I want the core concepts explained in the tutorial so I'll be able to write and use build programs
+ explain declarative dep graph of Paths
+ derive idea from some objects explained in English
+ page
+ text
+ tell same in java
+ code snippets from java to page (so guaranteed to compile)
+ css for code snippets
+ text
+ define Source and Target, ingredients
+ explain why side-effect needed, as different concept
+ proper class ('text') for raw p elements
+ concepts before bootstrapping
+ bootstrapping and the ui
+ high-level descr
+ bash and ant
+ simplest: svn co bs
+ "if this is all you want to know, click (here) to use iwant"
+ more text to creating wsdef
+ find what files we have after wizard
+ mention eclipse settings when wizard mentions them
+ wish scripts, tab is your friend
+ hello world with eclipse
+ more text
+ eclipse-settings, read what we have
+ run list-of, hello
+ newline after hellos, for out-was assertion (and otherwise also,
to show good example of the old good habit)
+ more text to modify hello, rerun
+ polish lang: less "now", for example
(- bootstrapping with ant and using ant
(- ant not only for interactive but also for eclipse etc
* was already)
- inline to ant-cli, one doc for the whole ant topic suffices
- help output (like older iwant did) to mention both bash and ant
- pass cli type from cli to java
- at empty wish, not only mention legal targets but whole wishes
- bash: /abs/iwant/{target,side-effect,list-of}/...
- ant: ant -f /abs/.../build.xml -Dwish=...
- make sure user-preferences printed for ant-cli users, too
+ mention in bootstrapping
* maybe it's too much trouble, the bootstrapping is the same
than with bash, ant-cli is good enough as it is)
+ good order for explaining things in tutorial
* like this
* basics
* java modules
* tdd with java
* advanced
(- from separate story: javamodules
* already done)
+ ext libs in wsdef to advanced, not in the beginning
+ after javamodules: jacoco
+ wsdefdef and wsdef, base on javamodule tutorial
+ page
+ here iwant philosophy in action: don't tell it to run tests
but wish for (could be boolean) coverage report
+ in each chapter mention chapter it continues editing
+ warn: revision needed in iwant-from
+ index page: status of project
+ writing own targets
+ undeclared ingredients
+ declared ingredients
+ undeclared parameters
+ declared ingredients
+ target's own src as ingredient
+ fix English grammar: declare x "an ingredient", not "as an ingredient"
+ As @buildscriptauthor I want ws def ctx stuff in wsdef constructor, not
separately for functions targets and sideEffects so I can instantiate
my JavaModules there
* currently targets and sideEffects need to save the ctx, then JavaModules
needs to be created lazily, blindly trusting the ctx has been created
* current IwantWorkspace will just be the factory so it has a default
constructor and a factory method
+ so better to rename stuff
+ IwantWorkspaceProvider -> WorkspaceModuleProvider
+ WorkspaceDefinitionContext -> WorkspaceModuleContext
+ IwantWorkspace -> Workspace
+ Workspace -> ExampleWorkspace
+ new: WorkspaceFactory and WorkspaceContext
+ use the factory
+ cast wsdef to factory, use it to create ws
+ the ctx implements also wscontext impl
+ fix tests
+ assume factory exists
+ example factory creation
+ fix example wsinfo creation
+ fix descript
+ As @buildscriptuser I want ScriptGenerated to detect cygwin env and wrap the script with a cygwin bash call so the script works on Windows -- even if the shebang is something else than bash
+ use Windows to develop the wrapper
+ fix ScriptGenerated test to tolerate Windows paths in output
+ abstract path mangling so it can be mocked
+ abstract os detection so it can be mocked
+ tdd finding cygwin bash.exe
+ test correct wrapping is used if and only if on Windows
+ test tests are still green on linux
+ real testing
+ fix: ScriptGenerated.execute used by other targets must prepare
execution env like SG itself does
+ again testing => usable
+ As @buildscriptauthor I want a Target of a downloaded and unzipped github commit so I can use the code in it
+ a convenience class around downloaded, unzipped...
+ and also a new concept: SubPath, because the github zip has a directory in it
+ descript to verify the actual effect
(- descript the real "so that": classes compiled from code from github
* nah, examples are enough)
# above: stories implemented earlier but closed a lot later
= In progress
= Planned
- fine-tuning after -> github migration
- reusable test setup, at least mocked iwant zip (I guess I have an ever ongoing story for this...)
- update external references (url and license have changed)
- find out what they are :)
- remove unnecessary gitignores from root .gitignore (under # svn...)
- advertise
+ facebook
- mention in the reddit thread (if commenting still allowed; otherwise: new thread)
- elsewhere
- improvements for target written in bash
- make descript examples less abstract, do something at least semi-useful
at least add such an example after the artificial examples
- explanative text to the descript chapter
- naming: functions in input and output?
- is needed: use ScriptGenerated in a way we get cygwin support
- corner case tests needed
- escape cases for ingredients-and-parameters output
- especially parameters that can contain anything
- source target script before defining nonoverridable functions, for robustness
- further stories
+ java target impls accessable via script language libraries?
* yes, this follows naturally
- side-effects, or are they easy enough with "iwantish" scripts?
- python library
- script that creates ws that supports writing targets only using
bash&editor (downloadable so no installation needed)
- split to dedicated modules?
- prefix all bash functions so no accidental name clashes with user code
- test incorrect usage of target function in
- target that finds ingredients from list of targets
* if this is needed!
- simple case
- prevent cycle
- improvements to workspace api related code
- remove redundant stuff from wishdefcontexts: if given at ws creation,
not needed there (maybe other contexts can be removed)
- fix implementations according to new naming
+ method workspaceClassname -> workspaceFactoryClassname
- fix variables according to new naming
- fix documentation according to new naming
- tutorial improvements
- writing own side-effects
- want some target
- concatenated before its first use
- also here just add the missing feature: line(String)
- this is a good example of automatic dep tracking
- prerequisites for tutorial
- understand basic shell
- some grepping
- xargs cat for displaying target content
- ant is 1st example to show output goes to stderr => xargs cat works
- after jacoco: distribution dir, with
- new feature to Directory: executable copyOf
- use dot syntax in binary groups
- bootstrapper alternatives
+ svn externals
+ cmds
+ explanations
- publish the script
- tutorial: create iwant-from, svn co and use the script
- explain the idea: minimal amount of iwant text to commit to
project's own repo
- @bugfix @antstderrbug
* AntGeneratedTest started failing: if >2 tests methods are run, assertions of stderr fail
* ant really doesn't print anything after mentioning the build script: I printed stuff before
and after calling ant, and they can be seen by the test
- reliable assert of jacoco txt report content
- find out what jacoco promises
- if nothing, suggest they do
- sort in test before asserting
- robust update of jvm: refresh targets
- maybe put version in global cache dir name
- maybe automatically add to content descriptors
- define default java compliance in JavaClasses, not the caller of it
- jdk1.7 location from user-preferences
- missing prefs file fails only if needed
- missing pref in file fails only if needed
(- fail if jre/lib/rt.jar not found
and other finetuning by real usage, this is only
a temporarily needed functionality)
- pass in ctx via constr/factory for wsdef
big change to api!
- improvements to ScriptGenerated
- tell story about making it easier to run unix commands in path, now
caller of execute needs to prepare a script for it
+ concatenated takes native and unix paths
- use slashes in native windows paths
+ concatenated
+ binmodule
+ eclipse settings
+ scriptgenerated cygwin wrapper path
- other?
- test on Windows and fix usages of concatenated
- either make all tests pass on Windows or write a story about it
+ make some tests green: slashes, newline hacks
* very difficult
- As @developer I want IwantTestCase fields private so I can be more confident that the subclass intentions are still valid, especially regarding test area root versus wsroot
+ hide fields temporarily and replace some direct refs with method calls
+ hide testArea, fix refs
- hide wsRoot permanently and fix all refs
- more TestNG tasks
- stories about more helpful and cleaner output at test failure
- cleanup: WorkspaceDefinitionContextImpl.commonsIoJar is Path, not Downloaded
- cleanup: iwantExampleWsdef module deps in alphabetical order
- real test
- polish text for descript
- As @buildscriptuser I want iwant to first test a module whose sources I have touched most recently so I get test failure as fast as possible
* more generic: refresh ordering depends on ingredient timestamps
- IwantWsRootFinder: give the root, not only essential, and use that instead of essential whenever
you really want the parent (the root)
- As @buildscriptauthor I want to define ingredients without names so that I can save typing; I never read content descriptors so it's ok if the names are generated
- As @eclipseuser I want an option to have eclipse installed with the scala plugin so I can edit scala without manually installing the plugin
- As @buildscriptauthor I want to optionally use full names for binary modules loaded from repository so I can use org.eclipse.core.runtime and swt.runtime of the same version at the same time
* on the other hand, these jars may not even work together, but there may be other cases like this
- code affecting target changes -> dirty
* As @buildscriptauthor
I want a target to be dirty if I have changed code
so that the cached content will be valid
* this is difficult, without making everything dirty when wsdef classes changed
- @epic As @buildscriptauthor I want external dependencies to handle their dependencies automatically so I don't need to define them
- example: jacoco distribution depends on a certain version of asm
- jacocoreport: if no jacoco dist defined, use latest with correct asm
- use tested ant by default, too
- use in tutorial
- what others?
- As @buildscriptauthor I want to split my wsdef(def) into many modules so it's easier to maintain
* maybe now it's time to inject context in (optional?) constructor of wsdefdef
* also maybe inject wsdefdef to wsdef
* otherwise it's clumsy to define a build-time module that depends on iwant
so that the module can be used like normal modules
- after changing, change also generated example and tutorial
- As @developer I want own type for urls, to work around all problems of, especially the hashCode DNS brainfart
- As @developer I want the ant output "Total time" lines away from the tutorial so it will be reproducible
* also: as @buildscriptuser I want compact ant output so the tutorial will be easier to read
+ upgrade ant in tested deps
+ upgrade ant for own build of iwant
(- add -S to all ant calls
* argh: that suppresses output from java executed by <java>)
(- pass own logger to ant calls
- AntGenerated
- commands in tutorial
* even that does not work, at least with a small effort:
Main does not accept -lib, Launcher would be a big effort to use.
And having ant in cp of AntGenerated easily breaks things.)
- so, easiest: add flag --deterministic-output to ant
- feature request
+ submitted:
- take into use, if fixed
- patch?
- remove unnecessary grep -v's in tutorial
- As @buildscriptauthor I want to define source and target compliance separately to javamodules and javaclasses so I have more control over sources and targets
* e.g. forcing old bytecode on modern machines
* currently javamodule has javaCompliance, javaclasses has source
- make both have both attributes, keeping javaCompliance convenience
for setting both simultaneously
- As @buildscriptauthor I want classes excluded from jacoco report by classname pattern so my special classes e.g. configuration does not affect the result
* offline instrumentation required, a bigger change to the way we use jacoco
- As @developer I want to exclude findbugs testfodder etc from the findbugs report of iwant so I don't get false positives
- support for findbugs filter
- use it
- stories about defining java classes with different settings (e.g. no debug) for java src modules
- As @buildscriptauthor I want iwant to give a friendly error message during compilation at the latest if a resource directory is missing so I can fix the module definition
* currently throws NPE
- As eclipse user I want to have .classpath files that are identical on all workstations so I can version them so solving eclipse settings problems is easier (for example after iwant upgrade)
* afaik this requires classpath variables
+ defines USER_HOME
- optional setting for EclipseSettings to use the variable
* postponed, because this is a bit too laborous to normalize at this point: /home/wipu/.net.sf.iwant/cached/ClassesFromUnmodifiableIwantWsRoot/%2Fhome/wipu/.net.sf.iwant/cached/UnmodifiableUrl/http%253A/
- @anticipated As @buildscriptauthor I want full control over the java module runtime path order so I can use fragile enterprise modules like xml parsers
- @epic As @buildscriptauthor I want all observable collections of api implementations to be protected against mutation after building them so I don't accidentaly cause bugs
- JavaModule impls
- Targets
- As @developer I want a reliable classloader so that I can use AntGenerated even if I have ant.jar without ant-launcher.jar in my classpath
* case: AntGenerated fails to load ant classes, if ant.jar is in classpath without ant-launcher.jar
* this is because urlclassloader delegates to parent, and it will fail to load the main class because it refers to another class in the missing ant-launcher.jar
* the child classloader (urlclassloader) never gets an opportunity to load the class that it would be capable of loading
- a classloader that can load missing classes from the given urls and at the same time load system defaults from the parent (quite an @epic I guess, unless we use a 3rd party utility, and only use the current simple classloader for bootstrapping)
- As @buildscriptauthor I want to define (fluently) a ruleset for PMD so I get only the warnings that really are an issue in my code
- As @buildscriptauthor I want to define runtime dependencies to a binary module so a module using it automatically gets the runtime dependency in its test and runtime classpath
- make sure the concepts test-runtime and runtime dependencies exist and work
- @bugfix: EmmaReport must not fail by trying to access the nonexistent ec file, if a module has tests but they don't call any main code
- As @developer I want a layer on top of File so I can test the emma backslash problems and also start making it more user-friendly than File
- make ctx.cached(Path) return new type
- follow the compiler
- As @buildscriptauthor I want a convenience method Untarred.from(src) that detects the compression to use and derives the target name from src so I don't have to type them 99% of the time
- As @buildscriptauthor I want a findbugs report of my code so I can fix bugs
- enable and fix test in iwant-plugin-findbugs
- use ant or something
- use full untarred distro of findbugs
- fork jvm, setting findbugs.home
- As @buildscriptuser I want an easy (automatic) way of ensuring that eclipse settings refer to existing external dependencies so I don't get broken compilation
* should eclipse-settings always depend on them, why not?
- if so, make it possible for side-effect to depend on targets
- @bugfix: fix: parallel script run sometimes fails with "text file busy"
* may be caused by chmod!
+ cleanup closing in StreamUtil and FileUtil
+ utilize pipe in copying of files
- incr numbers in WishEvaluatorTest.testScriptsWorkCorrectlyInParallel()
- test chmod in isolation
- fix, try to find even a workaround
- @refactoring: As @developer and @buildscriptauthor I want test utilities, like mocks, for easy and nonverbose testing of iwant and iwant-based code
+ new package: testing
+ rehearse by moving a couple of test utilities there
+ move all, creating a different package for entry2/3 stuff
+ WsRootFinder
+ test area 2
+ all testareas
+ reuse code btw testareas (could also combine,
but separation may be handy later)
- test Concatenated and HelloTarget in their own modules
- also JavaBinModule
- maybe another module for these
- modularize test tools so testing is possible
- reusable mocks of iwant interfaces/classes
- object mothers/testworlds for nonverbose setUp and tearDown
- @enhancement: don't put duplicates of classes for emma coverage, even if they come from cumulative test and main deps
- @enhancement: clean up the way JavaSrcModule defines test classes.
* Maybe better to just use a regex, whether it matches one suite or many classes
* just rename the string setter as testClassRegex and always use it
* no, better to have exact name and regex as separate properties =>
exact name passed to junit as such, regex is used by ClassNameList
- use a sane default for the regex (*Test, not Abstract*) when
neither setting given (syserr this so the magic won't be completely
- @bugfix: As @buildscriptauthor I want combined sources updated when iwant sources are re-exported so I can see fresh sources when I develop using iwant-from a file
* But keep it fast
- As @buildscriptauthor I want target JavaClassesWithResources so I get classes and resources under the same directory, which is easier for classpaths
- As @developer I don't want iwant tests rerun just because testarea was touched so that it gets rerun only when real sources were touched
- @bugfix: As @buildscriptauthor I want iwant to xml escape jvmargs passed to EmmaCoverage so I don't have to do it
- @bugfix: indirect ingredient check does not work with many instances of the same Path
- see if it's time to make Path an abstract class that fixes equals,comparable,hashCode for good
- @bugfix: eclipse env script generates unix-style path to workspace in cygwin => windows eclipse looks under C:/thepath instead of C:/cygwin/thepath
- see what else needs cygpath
- maybe tell a story about generating eclipse for another machine
- improvements for Downloaded checksum handling
- SHA-256: store map of algo->expected key
- url for checksum instead of the value, use in FromRepository.ibiblio
- exit status chapter to tutorial, and test ant and bash cli failure there
- As @developer I want the old iwant build to use the current distillery version of iwant so I can get start getting rid of the old main branch
+ practice eclipse project declaration in dummy project first
- make the change, using svn:externals to control version
* keep current wsdef, for copying website building and tagging scripts
- generate all eclipse projects
+ first wsdef and wsdefdef
+ delete as-iwant-developer eclipse settings
+ delete iwant-lib-{ant,junit}
+ delete iwant-core as eclipse-project, keeping the files
+ delete ref to lib-junit from distillery projects
- generate eclipse settings for all projects
+ testJava and testDeps for JavaModule
+ testJava and testDeps affect .classpath
+ upgrade svn:externalized iwant to utilize these
- local classdir for JavaModule
- add testJava to all projects
- then make iwant ws generate all eclipse settings
- svn:ignore generated eclipse setting files
- create public (remote) version of the bootstrapping tutorial
- adapt the current iwant ws to use the new bs tutorials
- adapt the static html
- delete old wsdef
- @bugfix: make sure iwant deletes cached target before refreshing
- make Iwant3Test use modified wsname to verify no hard-coded example stuff there
- findings from real usage:
- targets() should just return collection of Paths, not Targets, wishes may be reasonable against ExternalSources for example
- but fix externalresource wish script path handling, the leading slash breaks number of ".."s
- binary javamodule should have empty deps, not null
- As @buildscriptuser I want iwant to fail if I try to run it several times in parallel for the same workspace so it doesn't corrupt anything
* locking, also mention lock location in case a run failed to delete it
- As @buildscriptuser I want to declare worker count once for my OS user so I don't need to create and maintain ws-specific files
- As a @buildscriptauthor I want to declare some targets single-threaded so targets depending on it get never refreshed in parallel
* e.g. for tests that need the display, a certain shared sql table area or some other shared resource
- @bugfix: delete cached file (or content descriptor) if refresh fails, otherwise partially created file will make next run think it's uptodate
- @bugfix: as @buildscriptuser with @wintoys I want a target refreshed when a source has been DELETED
* I remember having the problem with Windows that it doesn't touch timestamp of parent
when deleting a file, so IF this is really the case and a wuser demands:
- update the test to touch parent timestamp back after deleting the file to prove need for the fix
- use same TimestampHandler than Iwant2
- a dedicated cache dir for source dir listings
- refactor: common supertype for Source and ExternalSource
- As @developer I want this long and deep text broken into a readable list of stories (not too detailed), both to done and planned, so I can analyze how I proceeded and also see what has been done and what not:
- optimization: don't even write descriptor for source
- unmodifiable target is cached under user-global cache
- unmodifiable target descriptor is also under user-global cache
- wishevaluator aspath returns File, not prints
- laziness: handling of cached file if stream requested
- if ingredient says it's cheaper to regenerate stream and nobody needs file => delete file (saving uptodate check)
- if uptodate cached file exists, use it
- if oudated cached file exists
- only stream requested => delete cached file
- someone else needs as file => tee to file while streaming
- delete old wish scripts at refresh
- descript: modification of wsdef causes different output
- move WsRootFinder to main src from test
- dedicated module for WsRootFinder, replace other classpath markers (in testarea at least) with this
- laziness of compilation of unmodifiable
- remove the zip tests using versioned zip files now that we have the svnkit unzip test
- checksum after download
- test download of incorrect content causes failure (sha check)
- test sha failure causes rename of cached file
- incorrect iwant-from => friendly error
- maybe: more expandable contract between entry and entry2
- instead of assuming entry2 can only depend on entry, there could
be a text file that can be passed as the source list to javac
- new name for cache: as-someone/.iwanted
* no more with/bash: cli does not matter
* past tense shows for the possible user of the path that this is potentially stale data
- user-specific external dependencies cache: ~/.iwant/cached/by-url/<escaped-url-with-slashes>
- maybe: another entry method: one with given iwant-from, for fully embedded case
where a file is not needed for that
? on the other hand, the as-someone dir is needed anyway
- remove main and its tests from core
* the entry is the only main, from then on just proper java
- from java both entry and entry2 are usable as entry points
- publish
- modify bootstrapping tutorials
- clean up the other bootstrapper story
- only one place for reading bytes/string from stream
* currently Iwant, Iwant2 and StreamUtil
* maybe just keep StreamUtil as facade
- As @buildscriptauthor I want iwant not to overwrite my wsdef even if I delete wsdefdef and iwant regenerates it and it points to my existing wsdef so that I don't lose my work
- As @developer I want better names for wsdef and wsdefdef (IwantWorkspaceProvider and IwantWorkspace) and also for their eclipse projects
* for example currently the java interface for wsdefdef is WorkspaceProvider
- rename interfaces
- rename java references
- rename non-java refs, like in i-have
- As @developer I want cached content descriptor logic behind an interface and use real impl only in one integration test that just tests features here and there, mock in current tests.
* also, do the same to cached content and maybe other file functionality
- As @buildscriptauthor I want the eclipse-settings side-effect to generate settings for other projects, not only as-someone
* here we need to fix the many hardcoded values
- As git user I want an easy way to get a bootstrap, because I cannot use svn:externals
* option: a script to svn export and delegate to
* option: downloadable package, to be commited
- As git user I want an easy way to ignore generated iwant stuff
* either restructure so commited stuff is in different dir than generated
* or a helper side-effect/script or something
- As @buildscriptauthor I want iwant to generate working wishscripts for my own side-effects so I can use iwant for scripting, not only defining and refreshing artifacts in the cache
* maybe a more concrete story needed here, to make sure this really helps
in real life
- example wsdef provides eclipse-settings side-effect
- test removing side-effects => no wish scripts
- test adding custom hello side-effect
- wish scripts are generated
- they delegate to the side-effect
- As @buildscriptauthor and @buildscriptuser I want to declare to iwant I use eclipse so it will automatically make the side-effect of fresh eclipse settings effective when running anything
- design good ui
* don't do this if it's possible to break compilation in eclipse so it's difficult to fix it back
- option: just do it after successful refreshes
- @anticipated As @buildscriptauthor I want to declare that I use IntelliJ IDEA so iwant will generate idea settings instead of eclipse settings
- As @developer I want stories from the "in progress" section of the old backlog so I don't lose good ideas
- logging: one letter to show if the generated target is a local (workspace) or global (user cache) one
- As @buildscriptuser I want downloaded files cached by sha256 so the file is not downloaded again if some other buildscript uses a different url
* sha256 would then be mandatory for all downloads
- security guard: whenever opening file for writing, make sure the canonical path (what about symlink resolving?) points to an allowed directory
* important when building a path from url for example
- As @developer I want new tests for automatic rebootstrap after editing iwant-from.conf now that sha verification support cannot be used for that in tutorial
* new bootstrapper has to use a rev that already implements sha so another way is needed
* now that iwant-rev is no more used, cached iwant is always in the same directory, so
the probability of the feature being already broken is high!
- make iwant/ print svn revision?
- junit test for sha, if there is none
- As @developer I want a fixed version of descript so we no more need >> to make sure script output doesn't delete previous output and break descript output assertions
- As @buildscriptauthor and @buildscriptuser I want to define cached name and target name so e.g. cached html files are more easily deployed/displayed and the "logical" name can express the meaning
- test normal case
- test name clash is detected and "use subdir" hint is given
- test subdirs in cached name work
- use in iwant website target
- potential bugfix: filter out .svn etc when determining directory modification time
- test with .svn
- manually filter or use and Fileset
- As @developer I want to see some progress messages in stderr so I can more easily detect problems and remember/understand what's going on
- replace/enhance
- As @developer I want WsDefClasses to inherit some abstract super class together with Target instead of extending Target, to be able to make Target final again so users don't get any stupid ideas about having to extend it
* Path logic should be the same in every workspace; new Content can and should be defined easily
- As @buildscriptauthor I want WsDefClasses to put contentdescription in a different cache dir than my own targets, to avoid name clashes (just like the actual cached content already does)
- As eclipse user I want iwant to warn as long as I have outdated eclipse settings that differ from the ones defined in my wsdef so I won't debug classpath problems in vain
- eclipseProjects outdated => warn
- after that cached ecliseProjects different than "deployed" ones => warn
- As @buildscriptauthor I want to define extra ingredients not mentioned in a script but indirectly needed at runtime so the script will be rerun when those ingredients have changed
* e.g. sources and sources
- bugfix: As @developer I want to see an error message when bootstrap fails because of compilation error caused by missing svn add of new file
- As @developer I want to refactor all ouput to go through the same interface, to make sure everything is prefixed, and to perhaps control verboseness later
- As @developer I want iwant-url replaced with iwant-from, because it's not an url in the iwant workspace
* and when iwant-rev has been removed, the file iwant-from.conf only contains iwant-from
- As programmer I want to reuse another project integrating on source and build level so I don't need hassle with binary releases
* dependencies could be handled through an interface per classpathitem in the Path that defines the needer
* then both sides can define those whatever way thay want, binary or source
* TODO more stories: what if 3rd party binary dep could declare version constraints like
"at least 2.x"
- As @buildscriptuser I want script generated content (e.g. iwant descripts) to refresh stderr more frequently, if java exec allows this, so it will be easier and more reliable to track script progress
- As @developer I want generated eclipse settings so no more duplicate classpaths
- define all eclipse projects using iwant
- document copying them in place
OR: see story about side-effects
- refine eclipse stories and implement to make it more usable
- As eclipse user I want jar classpaths to point to the workspace-relative as-WSNAME-developer/with/bash/iwant/cached/... instead of absolute paths so the workspace is easier to move (maybe) and so I can choose to version them when it's a pragmatic choise.
- bugfix: as @buildscriptauthor I want iwant to fail if I define two paths with the same name instead of just overwriting
* note: even src cannot have same name as target, because content descriptors mention paths by name
* so, if a src is replaced with target, descriptor needs to change
- As a @buildscriptauthor I don't want to see iwant tests in my classpath so I don't accidentally use them
- separate iwant-main-classes and iwant-test-classes in phase2.xml
- @maybe as a @buildscriptauthor I want bootstrapper to generate example files that need editing before it agrees to continue so I won't screw things up by running the bootstrapper again before really editing the confs
- descript all
- choose option:
* just compare content to the example string
* put extra conf "remove-me"
* put confs in comments
- As a @buildscriptauthor I want the bootstrapper to use an ".unverified" temp dir for classes (like svnkit download does before md5 check) so compilation failure won't leave the system in a broken state
- As @buildscriptauthor I want to use some simpler syntax for the whole buildscript so iwant will be more ergonomic for really small projects that don't need java and IDE for anything
* ngr or even simpler?
* if custom content or anything fancier is needed, I guess it's ok to require java
- As a @buildscriptuser I want several srcs in an eclipse project
+ implement
- test in real project (gluent)
- descript
- TODO eclipse project stories
- dep to other eclipse projects as project deps, not to iwant cache
- src dir from the classes target, not hardcoded "src"
- and support multiple sources for the classes (if supported by the JavaClasses content)
* or some other helper to create an eclipse project for given classes and test-classes
- src link name? maybe src-main or something, when supporting many sources and test classes?
- distinction between targets and nontargets is clumsy: why not just declare all needed paths as dependencies? would make it easier to build eclipseprojects from javaclasses
- somehow make it unnecessary to get content from target and cast it
- As a @buildscriptauthor I want iwant the JavaClasses content to remember the order of "using" calls so I can control the actual classpath in the unfortunate case I need classpath items that contain the same fqcn's with different semantics (a real problem in the real world, especially in the enterprise/xml world)
- save the cpitems internally in a list, even though publishing them as an alphabetical sortedset for depencency management
- use the list during compilation
- use the list when generating eclipse .classpath
- As a @buildscriptuser I want to be able to move the whole workspace without breaking iwant
* use only relative paths internally
* should be mostly done, but
- descript and fix possible problems
- As a @buildscriptauthor I want all cached targets invalidated when iwant is rebootstrapping itself because I changed its version
* even downloaded files, for now (the "don't do it" rule of optimization)
- As a @buildscriptauthor I want to be able to define tests for my workspace definition so if I break it iwant won't use it
* this is essential for bootstrapping
- As a @developer I want iwant itself compiled with its workspace definition and tested with it so that I can bootstrap the whole tool, tested and working
* if iwant gets later split into submodules, include only essentials here
- As a @buildscriptauthor I want an error message if I refer to a java classes directory with a missing source
* in the tutorial, call these test classes, to maintain the red-green cycle later
+ done but untested and undefined details
- As a @buildscriptuser I want an error message if I refer to a java classes directory of uncompilable sources
+ done but untested and undefined details
- As a @buildscriptauthor I want to define a target for debugless java classes so I can ship my code
= Story sketches, to be evaluated and or rewritten
- todo write stories:
- "i just touched src X, what needs refreshing"
- "autoupdated entrypoint build.xml that can also be imported to eclipse as a gui for iwant of the ws"
- root could just have one target, all, and list-of/targets would be its direct deps
- refresher must delete cached target if refresh fails
- todo gen wishscripts lazily
- EPIC: As a @buildscriptauthor that has to serve users that don't have unix tools installed I want iwant to provide a JPC-based virtual machine for running my scripts
- a way to command the VM and read its results
- a very minimal disk image that contains basic tools
- As a @buildscriptauthor I want an easy way to define a virtual machine image that contains the software I need so the base image shipped with iwant can be small
- As a @buildscriptuser I want to see a refresh plan for any target so I know if I really have time to refresh it yet
- As a @buildscriptuser I want to see a time estimate in a refresh plan, based on previous refresh(es)
- As a @buildscriptuser I want targets refreshed in an order that tries to find cumulative problems as early as possible
* meaning targets that are most depended on are built first
so if they have problems, their dependencies probably need
to be refreshed again anyway
* if equal, recurse into targets depending on them
- As a @buildscriptauthor I want iwant to use some non-default package for my workspace definition class and iwant still to be able to auto-detect the source directory location
* read the package declaration from the java file to deduce where the src root is
+ now as-iwant-user/to-use-iwant-on requires all data as cli arguments
so this story no more makes sense
- As a paranoid @buildscriptauthor I want some control over the validity of my downloaded targets
* if the current consistent "assume nobody is fool enough to touch the cache" strategy seems to work,
just provide a wish for checking the cached targets, one by one or all at once