It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

How to find issues that were moved from one project to another ....

Is there a way to find all issues? I can go in quick search and find one by one but that’s very tedious

How can I find all issues that were moved from project A to project B?

4 answers

1 accepted

As JQL history search does not support the project field this is not possible out of the box.

You can use Script Runner plugin and the following script to find all issues moved from project AAA to project BBB.

import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.web.bean.PagerFilter

jqlQuery = 'project = BBB'
fromProject = 'AAA'
result = ''

def changeHistoryManager = ComponentAccessor.getChangeHistoryManager()

getFilterResult(jqlQuery,log).each{ Issue issue ->
    oldKeys = changeHistoryManager.getPreviousIssueKeys(issue.id)
    oldKeys.findAll{it==~/$fromProject.*/}.each{
        result += "$it -> ${issue.key}\n"
    }
}

return result

List<Issue> getFilterResult(String jqlSearch, log) {
    def searchService = ComponentAccessor.getComponent(SearchService.class);
    def user = ComponentAccessor.jiraAuthenticationContext.getLoggedInUser()
    List<Issue> issues = null

    def parseResult =  searchService.parseQuery(user, jqlSearch);
    if (parseResult.isValid()) {
        def searchResult = searchService.search(user, parseResult.getQuery(), PagerFilter.getUnlimitedFilter())
        issues = searchResult.issues
    } else {
        log.error("Invalid JQL: " + jqlSearch);
    }
    return issues
}

Henning

 

We have jira 4.4.5 running and also using Script runner plugin. Thank you for sharing the script to get the issues that are moved form project AAA to project BBB which is exectly what i am looking for. Appreciate if you could let me know the way to execute this script to get the result.

You have to paste this script to into the script runner console, select Groovy as scripting engine and run the script.

Maybe you have to adapt the script for 4.4.5, I only tested it on 5.1.8.

Will this script impact other data if i execute on production?

It's only reading information. Depending on the number of issues and your system it may decrease the performance of the system for a moment.

Best is, to try it on a test environment first.

is there an Oracle database query that can do the same thing?

Thanks a lot Henning!!! The script works absolutely great! You have just saved my day and most probably plenty of others too...

Regards,

Kishore Srinivasan

Hi Henning,

Thank you for sharing the script so that more people can benifit out of it.

But unfortunately I am getting below error when i try to run script for my projects

JIRA==> 6.4.13

Adaptavist Script Runner for JIRA Standard Edition==> 3.1.4

Error
startup failed: Script16.groovy: 12: unexpected token: issue @ line 12, column 43. ult(jqlQuery,log).each{ Issue issue -> ^ 1 error
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script16.groovy: 12: unexpected token: issue @ line 12, column 43.
ult(jqlQuery,log).each{ Issue issue -&gt
^1 error

It would be great if you could provide any guidance related to this

Thanks a lot! 

Cheers!

Bhupesh

There seems to be a conversion issue while this answer was transfered to the new community platform. I corrected the script, please try again with the corrected script.

Thanks,
Henning

Perfect!!

Thank you so much!

Now I'll work on adding it for multiple projects and write the output to a file since there is no way to store the results in script console.

 

Cheers!!

Bhupesh

In the meantime the output format changed to html. I don't know if this was already the case in 6.4... maybe try to replace

result += "$it -> ${issue.key}\n"

with

result += "$it,${issue.key}<br>"

You'll get a comma separated list which could be copied out of the browser.


Thanks,
Henning

Thank you!

We are looking to automate this process like end user should be able to get list of tickets moved from project Ato B and B to A with a button click somewhere in UI in JIRA.

So thinking to put the results in a custom field and put the script in post functions.

 

Cheers!,

Bhupesh

If you want to use a postfunction you could write the result to the issue as a comment.

if (transientVars.keySet().contains('comment')) {
result+= "\n" + (transientVars.comment as String)
}
transientVars.comment = result

 In this case there should not be any html code in result.

That's really cool.

Can we write it to a custom field? Maybe count of ticket also which moved from A to B and B to A?

 

 

You can get the count by using 

oldKeys.findAll{it==~/$fromProject.*/}.size()

And of course this could be written to a custom field, see https://developer.atlassian.com/jiradev/jira-platform/guides/issues/guide-performing-issue-operations

@Henning Tietgens Any chance you can help me modify the code above to look at issues moved from any project? Instead of needing an individual Project Key

Sure, you could use this.

import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.web.bean.PagerFilter

def jqlQuery = 'project = BBB'
def result = ''

def issueManager = ComponentAccessor.issueManager

getFilterResult(jqlQuery,log).each{ Issue issue ->
def allOtherKeys = issueManager.getAllIssueKeys(issue.id)?.findAll{it != issue.key}
if (allOtherKeys?.size() > 0) {
// The issue had another key than the current one
result += "${allOtherKeys.join(", ")} -> ${issue.key}<br>"
}
}

return result

static List<Issue> getFilterResult(String jqlSearch, log) {
def searchService = ComponentAccessor.getComponent(SearchService.class)
def user = ComponentAccessor.jiraAuthenticationContext.getLoggedInUser()
List<Issue> issues = null

def parseResult = searchService.parseQuery(user, jqlSearch)
if (parseResult.isValid()) {
def searchResult = searchService.search(user, parseResult.getQuery(), PagerFilter.getUnlimitedFilter())
issues = searchResult.issues
} else {
log.error("Invalid JQL: " + jqlSearch)
}
return issues
}

You have to adapt the jqlQuery string to select the issues you want to inspect for moved ones.

Henning

@Henning Tietgens This is perfect as to what I need, unfortunately I am getting an error with this snippet

WARN [common.UserScriptEndpoint]: Script console script failed: groovy.lang.MissingPropertyException: No such property: issues for class: com.atlassian.jira.issue.search.SearchResults at Script66.getFilterResult(Script66.groovy:29) at Script66$getFilterResult.callStatic(Unknown Source) at Script66.run(Script66.groovy:11)

 I did replace "BBB" with a legitimate project, otherwise I haven't made any modifications.  I am on JIRA 8.0.2 (Server Side) and 5.5.3.1-jira8 of ScriptRunner.

I think for Jira 8 you have to replace searchResults.issues by

searchResults.results

Thanks @Henning Tietgens helps to look at the upgrade 8 notes, bad on my part!  Ok... one last thing I am struggling with is the log.error().  I'm getting "Cannot find matching method."  I see we are passing it, but for whatever reason it doesn't recognize it.   If I put log.error above the static line (obviously replacing jqlSearch), it works.

I think this is only an error for the console. If you run the script it shouldn't be a problem. If you want, you could add 

import org.apache.log4j.Logger

and define the type for log

static List<Issue> getFilterResult(String jqlSearch, Logger log) {

to get rid of the error in the console.

Thank you.... I had tried the import and even tried defining the type... I erroneously defined it as "Log log" and not "Logger log".   Ugh.  Thank you so much for your quick response!   I think we are sailing now!

I see this issue is very old. Has JQL been updated to be able to handle cases like this? We are on the cloud version and do not have script runner. 

I am also interested in learning about how we can query for issues that have moved from one project to another and I don't have a script runner.

The JQL Tricks Plugin seems to have a function to return moved tickets.

Hi Henning,

Its working fine if there are few number of issues are moved from the project.
But I'm getting an error while checking more issues those are moved from one project to another project . "Error timeout : No Stack Trace available."
Any way to fixed this issue ?

 

Thanks,

Sushanta

Hi Sushanta,

in this case you have to replace the "result +=" with "log.error " to write the output to the atalassian-jira.log file. This will continue, even if the UI reports a timeout. Additionally I would add a line "log.error "Done." before the line "return result", to see in the log file when the script is done.

Henning

Yes, you will get the timeout error, but the script will continue to run in background. Because in this case you don't see the result of the script, the result should be printed to the atlassian-jira.log file.

getFilterResult(jqlQuery,log).each{ Issue issue ->
    oldKeys = changeHistoryManager.getPreviousIssueKeys(issue.id)
    oldKeys.findAll{it==~/$fromProject.*/}.each{
        result += "$it -> ${issue.key}\n"
log.error "$it -> ${issue.key}" } }

log.error "Done."
return result

You can view the location of the atlassian-jira.log in the 'File Paths' section of the Jira system information page.

Henning

Hi Henning,

Thanks for your quick response.The work around is working fine. Now I'm able to see the results in catalina.out . 

Thanks a lot Henning!!! 

Thanks

Sushanta

How would I filter my results by last 30 days?

What last 30 days? Created?

accountspayable@omahasteaks.com

You can modify the JQL like : jqlQuery = 'project=XXX and issuetype=XXX AND created >= 2018-10-01 AND created <= 2018-10-31'

Hi There, Has anyone tried this on JIRA cloud ?

Suggest an answer

Log in or Sign up to answer
Community showcase
Published in Jira

The add-in you’ve been waiting for: Jira Cloud for Excel 🙌

Introducing Jira Cloud for Excel Here at the product integrations team at Atlassian, we are thrilled to announce the new Jira Cloud for Excel add-in! This add-in lets you export Jira data directly ...

966 views 9 25
Read article

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you