How can I add 'path' to my Artifactory AQL query? - artifactory

I'm using insomnia to make calls to the Artifactory API.
I have the following query, which works really well:
items.find({"repo":{"$eq":"my-repository-virt"}}, {"$and":[{"#my.fileType":{"$match": "jar"}},{"#my.otherType":{"$match": "type2"}},{"#prodVersion":{"$match": "false"}}]})
But I have a problem in that there are duplicate files in some sub-folders with the same properties/filename that I would like to exclude.
I would like to add path to this query, but I can never get any results returned.
The repository is a virtual repository that links to 3 other real repositories.
One of my colleagues can call the following query with the command line tool and get the expected results:
jfrog rt search my-repo-snapshots/myproject/subfolder/jars/*.jar
I have tried adding the path parameter to my query, I've tried removing everything except the repo and the path, like this:
items.find({"repo":{"$eq":"my-repo-snapshots"}},{"path" : "my-repo-snapshots/myproject/subfolder/jars/*.jar"})
I've tried with just the path, with variations on the path, including/excluding the repo name, using the virtual repo, the actual repo, but I always get a successful search with 0 results returned.
How can I build this query to search the virtual repo, along a certain path, and including certain properties?
EDIT:
I've also tried:
items.find({"repo":{"$eq":"my-repo-snapshots"}},{"path" : {"$match":"my-repo-snapshots/myproject/subfolder/jars/*.jar"}})
Both with the repo in the path and without, I still get 0 results.

OK I figured it out.
The path part needs to be added in with the {"$and": ...} section where the properties are included. Like so:
items.find({"repo":{"$eq":"my-repository-virt"}},
{"$and":[
{"path":{"$match":"path/to/relevant/folders/*"}},
{"#my.fileType":{"$match": "jar"}},
{"#my.otherType":{"$match": "type2"}},
{"#prodVersion":{"$match": "false"}}
]})

The easier fix would have been:
items.find({"repo":{"$eq":"my-repo-snapshots"}},{"path" : {"$eq":"my-repo-snapshots/myproject/subfolder/jars"}, {"name" : {"$match":"*.jar"}})
So the problem with your initial attempt, is that the "path" should match the folder and the "name" should match the filename

Related

Is there a way to fetch list of files belonging to a particular file format from a folder in a zip in Artifactory using REST/AQL?

We have a use case to download or at least list all .xml files from a folder inside a zip in Artifactory from a python script. Is it possible with REST or using AQL ? I am looking for a search query to get all xmls from a folder in zip so that I can use "archive entries download" thing from REST API to make download request for each file individually. Please help me with relevant information about the endpoint or query that I can use to achieve my task(list all xml in a folder in zip). Also please let me know of any other efficient approach to accomplish the task.
You can use an AQL query to get a list of files from a given path inside an archive.
As an example, lets take the my-archive.zip archive deployed in a repository names myrepo inside folder1 folder
The follow AQL query can be used to find all the xml files within this archive under the path level-1/level-2/level-3:
archive.entries.find( {
"archive.item.path":{"$eq":"folder1"},
"archive.item.name":{"$eq":"my-archive.zip"},
"archive.entry.path":{"$eq":"level-1/level-2/level-3"},
"archive.entry.name":{"$match":"*.xml"}
})
You can run this query using the AQL REST API method and get the following result:
{
"results" : [ {
"entry.name" : "dummy.xml",
"entry.path" : "level-1/level-2/level-3"
} ],
"range" : {
"start_pos" : 0,
"end_pos" : 1,
"total" : 1
}
}
Here is an example of calling this REST API using curl (the query itself is stored in a file called aql.json):
curl -XPOST -uadmin:password -H"content-type: text/plain" -d#aql.json http://localhost:8081/artifactory/api/search/aql

Artifactory: download all root files of latest published build, non-recursively

I would like to retrieve from artifactory the files that follow this pattern:
"my-artifactory-repo/project-name/branch-name/1234/*"
Where 1234 is the build number of the latest published build, and where * should not recurse into folders but just match the immediate files. I use build-publish to publish each build under the build name "project-name.branch-name".
I have written a filespec which specifies a "build" but not a build number, causing Artifactory to automatically select the latest published build. This works fine if I simplify the pattern to my-artifactory-repo/project-name/branch-name/*, which results in all artifacts for the latest build being downloaded.
However, where I run into trouble is with the requirement to download only the immediate files instead of recursing into folders. So I tried to use a regex as follows.
{
"files":
[
{
"pattern": "my-artifactory-repo/project-name/branch-name/(\\d+/[^/]+)",
"build": "project-name.branch-name",
"recursive": "false",
"regexp": "true","
"target": "./artifactory-tmp/"
}
]
}
However, each time I try to use a regex, I get zero results.
Some other things I've tried which didn't work:
Not surrounding regex with parentheses
Using a simpler regex like ..../build.bat (because currently I have 4 digit build numbers, and I know a build.bat file is there), with or without parentheses
not using a regex and instead using the pattern my-artifactory-repo/project-name/branch-name/*/*. But this causes recursing in spite of "recursive":"false"
using this search command to retrieve the available build numbers first, so that I can extract the last one and insert it into the filespec. However, there's no way to tell whether the latest build folder is already complete and published, or still currently uploading.
jfrog search --recursive=false --include-dirs=true "my-artifactory-repo/project-name/branch-name/"
The "regexp" option is supported only for the upload command, and not the download command. I believe that the file spec schema under the jfrog-cli documentation shows that. Options that are included in the file specs and are not supported are ignored. This is perhaps something that should be improved.
When the "recursive" option is set to "false" when downloading files, the command indeed avoids recursive directory search. However patterns that include multiple wildcards together with non recursive search, cause some ambiguity in the sense of how deep should the search get. Notice that a single wildcard can include multiple directories. It easy to understand what recursive means when the pattern includes a single wildcard, but with more than one, recursive is practically undefined.
See if you can make your pattern more specific, so that it catches exactly what you need. If this is impossible, consider splitting your pattern into multiple patterns. All patterns can still be included into the same file spec, because "files" inside the spec is a list, which can include multiple pattern and target pairs.

can I get the code lines containing specified words with git api

I want to get all code lines which contains specified words like orderInfo in git.xxx.com. And I read gitlab api document and it seemed I can get only the projects which contains specified word.
This is my expected output:
xxx orderInfo[].....
yyy orderInfo.....
....
hhh orderInfo.....
Is there any simple way?
Try using the search scope "blobs". Note that this requires Elastic Search to be enabled. Otherwise, you can simply checkout with git and locally use grep.

Uncaught error: There are multiple templates named 'velvet'. Each template needs a unique name. (..)

I have recently deployed my meteor app ( www[.]webmill[.]eu ) which was working just fine locally. I dealt with MIME type errors but am stuck with this one:
Error: There are multiple templates named 'velvet'. Each template needs a unique name. 1b1a247fc034d5089f331ec9540138ff6afd5f39.js:75:306
I checked but I don't have any duplicates and I can't find any info on how to solve this apart from a similar issue that existed with a meteor package, accounts-ui-bootstrap-3.
On desktop, I only get the initial full background image without being able to navigate anywhere on the page. Also I can put anything in my url like so : webmill.eu/nowaythisisarealurl and it will still display the same thing. It works as intended on displays under 1070 px width.
meteor packages I'm using:
meteor-platform
mizzao:bootstrap-3
pfafman:font-awesome-4
Any suggestions/help will be much appreciated!
You have two templates named velvet. I cloned your repo and ran this:
grep -r -i 'name="velvet"' *
Result:
app/client/image.html:<template name="velvet">
app/client/index.html:<template name="velvet">
Change the name of one of the templates.

Filter property based searches in Artifactory

I'm looking to use the Artifactory property search
https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArtifactSearch%28QuickSearch%29
Currently this will pull json listing any artifact that matches my properties.
"results" : [
{
"uri": "http://localhost:8080/artifactory/api/storage/libs-release-local/org/acme/lib/ver/lib-ver.pom"
},{
"uri": "http://localhost:8080/artifactory/api/storage/libs-release-local/org/acme/lib/ver2/lib-ver2.pom"
}
]
I need to be able to filter the artifacts I get back as i'm only interested in a certain classifier. The GAVC Search has this with &c=classifier
I can do it in code if this isn't possible via the interface
Any help appreciated
Since the release of AQL in Artifactory 3.5, it's now the official and the preferred way to find artifacts.
Here's an example similar to your needs:
items.find
(
{
"$and":[
{"#license":{"$eq":"GPL"}},
{"#version":{"$match":"1.1.*"}},
{"name":{"$match":"*.jar"}}
]
}
)
To run the query in Artifactory, copy the query to a file and name it aql.query
Run the following command from the directory that contains the aql.query file
curl -X POST -uUSER:PASSWORD 'http://HOST:PORT/artifactory/api/search/aql' -Taql.query
Don't forget to replace the templates (USER, PASSWORD,HOST and PORT) to real values.
In the example
The first two criteria are used to filter items by properties.
The third criteria filters items by the artifact name (in our case the artifact name should end with .jar)
For more details on how to write AQL query are in AQL
Old answer
Currently you can't combine the property search with GAVC search.
So you have two options:
Executing one of them (whichever gives you more precise results) and then filter the JSON list on the client by a script
Writing an execution user plugin that will execute the search by using the Searches service and then filter the results on the server side.
Of course, the later is preferable.

Resources