Done - I raised enhancement request #148598. We'll see what gets decided on this.
- Log in to post comments
Done - I raised enhancement request #148598. We'll see what gets decided on this.
Good times Robert - thanks for the memories :)
The following article (and it's ensuing discussion) may also be of interest to everyone:
https://community.intersystems.com/post/studio-tip-running-cos-commands…
HTH,
Ben
A colleague pointed out another option which is fairly complete already:
https://github.com/intersystems-ib/cache-git-studio
I played with it and would recommend it!
Please make sure to mark a response as an accepted answer once you are all set - it makes it helpful for others looking for an answer and prevents the 'unanswered' list from including things which have been resolved.
Thanks!
w $system.Version.GetNumber() will get you just the version number string
Joel - the first paragraph says that eGit is installed with Atelier automatically but Nicole has confirmed that this is not the case. Could you please edit the article and remove that statement?
Thanks!
Ben
Thank you - I will take a close look!
How does Port.SourceControl.Extension.VCS relate to %Studio.SourceControl.Base? None of the method names match so I am guessing that it doesn't extend it. Would there be a different handling class extending the Source Control Base class which calls the method in your Git class?
Thank you Rubens - that is very helpful!
Could you please also post a Gist for Port.SourceControl.Extension.VCS?
There is a huge benefit from two perspectives:
- If you need to refresh data in your Dev or Test environment, you can just grab the globals DB from Live and drop it in and not worry about overwriting any code in Dev or Test
- If you choose to deploy your code via a DB drop, you can drop in a new DB to replace the existing routines DB
NOTE - for either of these to work, you may need to map configuration into the routines DB (so you don't bring back Live config into Dev for instance)
HTH!
Ben
Robert - thanks for posting, and it's great seeing that you're still doing awesome work in this space!
All the best,
Ben
FYI ... we will have several sessions covering this topic at the Global Summit - attend if you can, otherwise check out the material afterwards!
For internal application development within InterSystems we use a variety of approaches, but the most common is as follows:
1) We use an internally developed issue tracking system, but we plan to eventually migrate to JIRA
2) We use Perforce for all of our source control
3) We have BASE, TEST and LIVE environments for every application, typically BASE and TEST being cloned from VM snapshots of LIVE. In addition to the Shared BASE VM, for those applications which are undergoing the highest rate of change, developers will create a local copy of the application to do their development work. Some apps have all changes being developed on Shared BASE and the changes are progressed (via our Change Control tool) to TEST and the LIVE. For applications where developers use Private BASEs, they commit there and then push the changes to Shared BASE and then to TEST and LIVE.
Feel free to ask questions (here or at Global Summit)!
Thanks for asking.
If you are going to be writing any JSON code in 2016.1, then these guidelines may save you a lot of time later:
https://community.intersystems.com/post/writing-forward-compatible-json…
Thanks Lexi! That is covered in the last point of this article as well: https://community.intersystems.com/post/writing-forward-compatible-json…
Yes of course :) Once you create a library of unittests you can script them to run automatically. If you are using a continuous integration / build server then you can script the tests to run after the build has completed successfully. We have some teams using Jenkins for this.
John,
If you haven't already done so, please contact the WRC to let them know how important it is to get the Production Class UI to respect source control hooks (I am with you all the way on this one, but Product Management needs to hear it from customers).
Thanks,
Ben
John - if you haven't already done so, please contact the WRC and let them know how important it is to get the Production Class UI to respect source control hooks (I am with you all the way on this one, but Product Management needs to hear it from customers)
Jennifer - Angular 2 is not supported by Angular Material. By picking Angular 1.x Chris was able to demonstrate the stack selection that we're using for many internal applications as well as what many of our large customers are using (REST+AngularJS 1.x + Angular Material).
Brendan - I think you are missing a ( in:
do file.WriteLine(^Global1key))
Pravin - nice article, thank you.
You might want to add "... using Extended Global Reference" to your Title (to make it easier to find in a search) and include a link to the documentation on that:
http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY…
Thanks for contributing :)
Kyle,
The macros are intended to prevent developers from having to refactor code at the same time as they perform an upgrade, as well as make it easier for application providers who have code running on a number of versions.
I've learned from experience that it is always best to have the fewest moving parts when possible when doing an upgrade so you can quickly find the cause of any issues that pop up. Therefore, I always try to write forward compatible code and only after all of my systems for a given codebase have been upgraded and are stable do I start to introduce backwards incompatible changes. These macros allow that very nicely. In addition, using the macros means that you have more flexibility to upgrade without having to schedule a concurrent refactoring project (even if it is just a find and replace refactoring project :) ).
All that being said, the macros are not intended for long-term use with-in an application. Once the 2016.1 > 2016.2 hurdle has been cleared then my recommendation would be to pull out the macros (find & replace) and stick with Caché's native JSON access going forward. But that can then be a project that takes place post-upgrade, thus simplifying the upgrade and lowering risk.
Joe,
Better yet, follow the instructions and use the Macros available in the following article (the macros are in a linked Gist code snippet) and then you can write your code in a way that it will work on 2016.1 and also on future versions of Caché without having to rewrite your JSON logic:
https://community.intersystems.com/post/writing-forward-compatible-json…
Hope that helps!
Ben
Awesome - thank you Fabio!
Fabio - does this work if you make changes via Object access as well, or just SQL?
Per #14: Logging - you requested a community Logging solution. Have you seen:
https://community.intersystems.com/post/logging-using-macros-intersystems-cach%C3%A9
This looks like a very good tool and I am seriously considering standardizing its use in my team.
Sven,
I know that customers have set this up before. Here are some old notes that I found which may point you in the right direction. NOTE - I have never done this myself so I con't be of much help beyond pointing out this starting point:
Implementation Outline: 1. Configure CSP to accept IIS's authentication headers and pass them to Caché 2. Set up delegated authentication to use existing security model to assign $username and $roles based on the user's domain accountname and/or domain groups. (Implement ZAUTHENTICATE.MAC) 3. Enable delegated authentication for any desired services and CSP applications -- in this case the system management portal. · Configuration (e.g. CSP application definition) · Login Page Logic decides based on Gateway Service User, whether to trust REMOTE_USER HTTP header, or to prompt for username/password (other fields such as PIN are also an option).
HTH,
Ben
Steve,
Here is some sample code that should help get you going in the right direction. NOTE - the byRef LD argument is a handle for the connection to the LDAP server and it needs to be cleaned up when you're done if you're going to fetch any attributes.
(sorry for the messed up indentation)
/// Authenticates against the configured domain, with username/password, passing a resulting a status ByRef and a returning success/failure valueClassMethod Authenticate(username As %String, password As %String, ByRef Status As %Status, ByRef LD As %Integer) As %Boolean{Set Status=$$$OK, ret=0If ('$data(username))||('$data(password)) { Set Status=$$$ERROR($$$GeneralError,"Both fields are required") Quit 0}Set sc=$$$OKTry {//Connect to the LDAP serverSet LDAPServer="myldapserver.mydomain.com"Set sc=$$$OKSet LD=##class(%SYS.LDAP).Init(LDAPServer)If LD=0 {
Set LDAPStatus=##class(%SYS.LDAP).GetLastError()
Set sc=$$$ERROR($$$GeneralError,"LDAP Init Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus))} Else { //Authenticate the passed in user by using the Binds command Set Domain=..GetDomain() If ($$$isWINDOWS) { Set LDAPStatus=##Class(%SYS.LDAP).StartTLSs(LD) If LDAPStatus'=$$$LDAPSUCCESS { Set sc=$$$ERROR($$$GeneralError,"LDAP StartTLSs Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus))} Else { Set LDAPStatus=##Class(%SYS.LDAP).Binds(LD,"",$lb(username,Domain,password),$$$LDAPAUTHNEGOTIATE) If LDAPStatus'=$$$LDAPSUCCESS { Set sc=$$$ERROR($$$GeneralError,"LDAP Binds Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus)) } }} ElseIf ($$$isUNIX) { Set cert = ..GetCert() Set LDAPStatus=##Class(%SYS.LDAP).SetOption(LD,$$$LDAPOPTXTLSCACERTFILE,cert) If LDAPStatus'=$$$LDAPSUCCESS { Set sc=$$$ERROR($$$GeneralError,"LDAP SetOption Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus)) Do ..RotateOnFailure(sc) } Else { Set LDAPStatus=##Class(%SYS.LDAP).StartTLSs(LD) If LDAPStatus'=$$$LDAPSUCCESS { Set sc=$$$ERROR($$$GeneralError,"LDAP StartTLSs Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus)) }}If LDAPStatus=$$$LDAPSUCCESS { Set LDAPStatus=##Class(%SYS.LDAP).SimpleBinds(LD,username_"@"_Domain,password) If LDAPStatus'=$$$LDAPSUCCESS { Set sc=$$$ERROR($$$GeneralError,"LDAP SimpleBinds Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus)) }}} Else { Set LDAPStatus=$$$LDAPAUTHMETHODNOTSUPPORTED}If (LDAPStatus'=$$$LDAPSUCCESS)&&($$$ISOK(sc)) { Set sc=$$$ERROR($$$GeneralError,"LDAP API Error: "_##class(%SYS.LDAP).Err2String(LDAPStatus))}} } Catch err { Set sc = $$$ERROR($$$GeneralError,err.Data) }If $$$ISOK(sc) {
Set ret = 1} Else { Set Status = sc }Quit ret}I certainly hope that the mystery parties who have been moderating that site are reaching out to Google in order to get it reinstated. There was certainly a lot of valuable information on that site!
See this thread on the Zen Community for a possible starting point:
https://groups.google.com/forum/#!topic/intersystems-zen/UI_2fVG9fF0
You can use $system.OBJ.Load() or LoadDIr() to load source from disk.